deltaspike-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rafael Pestano <rmpest...@gmail.com>
Subject Re: Best approach for testing repositories
Date Mon, 06 Apr 2015 22:04:30 GMT
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