deltaspike-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas Hug <thomas....@gmail.com>
Subject Re: Best approach for testing repositories
Date Tue, 07 Apr 2015 07:24:08 GMT
Hi Rafael
Any specific reason not to use Arquillian? You can also integrate the
persistence extension which works already nicely with DBUnit.

On Tue, Apr 7, 2015 at 12:04 AM, Rafael Pestano <rmpestano@gmail.com> wrote:

> Hi again,
>
> I have evolved a bit my example and could managed to test UserRepository
> from Gerhard ee6-ds-dm, sources are here:
> https://github.com/rmpestano/ee6-ds-demo/
> <https://github.com/rmpestano/ee6-ds-demo/>
>
> first thing i did was to disable application EntityManagerProduces in unit
> tests (remember i want to use my in memory db for tests):
>
> @Exclude(ifProjectStage = ProjectStage.UnitTest.class)
> public class EntityManagerProducer {
>
>     @PersistenceContext(unitName = "demoApplicationPU")
>     private EntityManager entityManagerProxy;
>
>     @Produces
>     public EntityManager exposeDependentEntityManager() {
>         return entityManagerProxy;
>     }
>
> }
>
>
> then i've create my producer in test sources:
>
> public class TestEntityManagerProducer  {
>
>   private EntityManager entityManager;
>
>   @Produces
>   @ApplicationScoped
>   public EntityManager exposeDependentEntityManager()
>   {
>     entityManager =
> Persistence.createEntityManagerFactory("TEST_PU").createEntityManager();
>     return entityManager;
>   }
>
>   public void closeEntityManager(@Disposes EntityManager entityManager)
>   {
>     if (entityManager.isOpen())
>     {
>       entityManager.close();
>     }
>   }
>
> }
>
>
> And here is my repository test:
>
> @RunWith(CdiTestRunner.class)
> @TestControl(projectStage = ProjectStage.UnitTest.class)
> public class UserRepositoryTest {
>
>
>   @Inject
>   UserRepository userRepository;
>
>
>   @Before
>   public void tearUp(){
>     User u = new User("testUser","first","last");
>     userRepository.save(u);
>     assertNotNull(u.getId());
>     assertEquals(userRepository.count(), 1);
>   }
>
>   @After
>   public void tearDown(){
>
>
> userRepository.getEntityManager().remove(userRepository.findUser("testUser"));
>   }
>
>
>   @Test
>   public void shouldFindUser() {
>     User user = userRepository.findUser("testUser");
>     assertNotNull(user);
>     assertEquals(user.getUserName(),"testUser");
>   }
>
>
> }
>
> I have added deltaspike-jpa module to the project to have transaction
> support:
>
> @Transactional
> public User save(User user) {
>     if (user.isTransient()) {
>         entityManager.persist(user);
>     } else {
>         user = entityManager.merge(user);
>     }
>     return user;
> }
>
> without it, i could not insert users during tests (@Before)
>
> here is test persistence.xml:
>
> <persistence version="2.0"
>    xmlns="http://java.sun.com/xml/ns/persistence"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
>
>    <persistence-unit name="TEST_PU" transaction-type="RESOURCE_LOCAL">
>       <provider>org.hibernate.ejb.HibernatePersistence</provider>
>       <class>org.os890.demo.ee6.ds.domain.user.User</class>
>       <properties>
>          <property name="hibernate.dialect"
> value="org.hibernate.dialect.H2Dialect" />
>          <property name="javax.persistence.jdbc.driver"
> value="org.hsqldb.jdbcDriver" />
>             <property name="javax.persistence.jdbc.url"
> value="jdbc:hsqldb:mem:." />
>             <property name="javax.persistence.jdbc.user" value="sa" />
>             <property name="javax.persistence.jdbc.password" value="" />
>             <property name="hibernate.show_sql" value="true" />
>             <property name="hibernate.connection.shutdown" value="true"/>
>             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
>       </properties>
>    </persistence-unit>
>
> </persistence>
>
>
> finally the dependencies I've added to project:
>
>       <dependency>
>             <groupId>org.apache.deltaspike.modules</groupId>
>             <artifactId>deltaspike-jpa-module-api</artifactId>
>             <version>${ds.version}</version>
>         </dependency>
>
>         <dependency>
>             <groupId>org.apache.deltaspike.modules</groupId>
>             <artifactId>deltaspike-jpa-module-impl</artifactId>
>             <version>${ds.version}</version>
>             <scope>runtime</scope>
>         </dependency>
>         <dependency>
>             <groupId>org.hibernate</groupId>
>             <artifactId>hibernate-entitymanager</artifactId>
>             <version>4.2.18.Final</version>
>             <scope>test</scope>
>         </dependency>
>
>         <dependency>
>             <groupId>hsqldb</groupId>
>             <artifactId>hsqldb</artifactId>
>             <version>1.8.0.10</version>
>             <scope>test</scope>
>         </dependency>
>
>
> Any other advices?
>
> I hope it helps someone ;)
>
> 2015-04-06 17:12 GMT-03:00 Rafael Pestano <rmpestano@gmail.com>:
>
> > Hi everyone,
> >
> > besides OpenEJB and cdi-control-ejb used in [1] what are the alternatives
> > (in terms of Destaspike) for testing JPA based repositories?
> >
> >
> > For out container integration tests i usually use something like this:
> >
> >  @Before
> >   public void inicializarCenario() throws Exception {
> >     startConnection();
> >   }
> >
> >   @After
> >   public void finalizarCenario() {
> >     closeConnection();
> >   }
> >
> > public void startConnection() {
> >     emf = Persistence.createEntityManagerFactory("TEST_PU");
> >     em = emf.createEntityManager();
> >     em.getTransaction().begin();
> >   }
> >
> >   public void closeConnection() {
> >     em.getTransaction().commit();
> >     emf.close();
> >   }
> >
> > TEST_PU is in test resources and usually uses in memory db, something
> like
> > below:
> >
> > <persistence version="2.0"
> > xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="
> > http://www.w3.org/2001/XMLSchema-instance"
> > xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
> > http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
> >
> > <persistence-unit name="TEST_PU" transaction-type="RESOURCE_LOCAL">
> >              <provider>org.hibernate.ejb.HibernatePersistence</provider>
> > <properties>
> > <property name="hibernate.dialect"
> value="org.hibernate.dialect.H2Dialect"
> > />
> > <property name="javax.persistence.jdbc.driver"
> > value="org.hsqldb.jdbcDriver" />
> >             <property name="javax.persistence.jdbc.url"
> > value="jdbc:hsqldb:mem:." />
> >             <property name="javax.persistence.jdbc.user" value="sa" />
> >             <property name="javax.persistence.jdbc.password" value="" />
> >             <property name="hibernate.show_sql" value="true" />
> >             <property name="hibernate.connection.shutdown" value="true"/>
> >             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
> > </properties>
> > </persistence-unit>
> > </persistence>
> >
> >
> >
> > The idea is to be "lighweight" and boot only JPA container so my
> > repositories can use the "test entityManager?
> >
> > I think of something like this:
> >
> > @RunWith(CdiTestRunner.class)
> > @TestControl(startPersistentUnits("TEST_PU"))
> > public class UserRepositoryTest {
> >
> >   @Inject
> >   UserRepository userRepository;
> >
> >   @Test
> >   public void shouldInserUser(){
> >          User u = new User();
> >  userRepository.save(u);
> >  assertFalse(user.isTransient());
> >   }
> >
> > }
> >
> >
> >
> > Can we reach somethink like that with Deltaspike test control?
> >
> > I also would like to integrate with dbunit so I can feed this test
> > datasource but thats another story
> >
> > WDYT?
> >
> >
> >
> > [1]
> >
> https://github.com/os890/ee6-ds-demo/blob/master/src/test/java/org/os890/demo/ee6/test/PageBeanTest.java
> >
> >
> > --
> > <http://www.advancedit.com.br/>Att,
> >
> > Rafael M. Pestano
> >
> > Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
> > http://rpestano.wordpress.com/
> > @realpestano <https://twitter.com/realpestano>
> >
>
>
>
> --
> <http://www.advancedit.com.br/>Att,
>
> Rafael M. Pestano
>
> Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
> http://rpestano.wordpress.com/
> @realpestano <https://twitter.com/realpestano>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message