Printemps junit test à l'aide de Gestionnaire d'Entité n'a pas d'insérer des données dans H2 système de fichiers de base de données

D'abord ma configuration:

  • JUnit version: 4.11
  • Version H2: 1.3.174
  • Printemps version: 4.0.5.COMMUNIQUÉ de
  • Hibernate version: 4.1.0.Final

Un peu de contexte:

J'ai un service web REST qui est déployé sur un serveur web Tomcat et qui a un h2 de la base de données sous-jacente. J'ai un service REST qui n'ont pas de POST/PUT méthodes. Lors de l'écriture d'un test d'intégration pour elle, j'ai ajouté manuellement les entrées dans la base de données à l'aide de l'H2 console et placé le h2-fichier sur le serveur. Enfin mon test d'intégration des appels le RESTE de service et les données que j'ai injecté manuellement dans la base de données est retourné et le test réussit. Ce n'est pas facile à gérer et il serait bon d'injecter pour chaque test, les données dont j'ai besoin (cette approche peut être utilisée pour d'autres tests d'intégration plus tard...). L'objectif est d'injecter des données dans la même base de données que l'application déployée sur Tomcat.

J'ai pensé qu'il serait très facile, et j'ai écrit un test d'intégration de réutiliser un même contexte de l'application qui est utilisée sur le serveur:

 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="org.h2.Driver" />
  <property name="url" value="${database.url}" />
  <property name="username" value="" />
  <property name="password" value="" />
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="be.wiv_isp.healthdata.catalogue.domain" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
        </props>
    </property>
</bean>

<bean id="jpaVendorAdaptor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
</bean>

où la base de données d'url est définie dans les propriétés de fil:

database.url=jdbc:h2:file:${healthdata.working.dir}/database/database-catalogue;AUTO_SERVER=true

Puis j'ai annoté le EntityManager comme mon PersistenceContext et écrit un simple test de l'unité:

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = {"classpath:/applicationContext-it-test.xml"})
public class H2Test {

    @PersistenceContext
    private javax.persistence.EntityManager em;

    DataCollectionDefinition dcd = new DataCollectionDefinitionBuilder()
        .withId(Long.valueOf(1))
        .build();

    @Before
    public void init() {
        em.persist(dcd);
        em.flush();
        em.clear();
    }

    @Test
    public void testGet() {
        DataCollectionDefinition found = em.find(DataCollectionDefinition.class, 1);
        Assert.assertEquals(found, dcd);
    }
}

Ce test se passe bien! Cependant quand je mets un point d'arrêt après les données est vidé à l'aide de l'EntityManager et je me connecte à mon H2 système de fichiers de base de données, rien n'est injectée!

Maintenant, je me demandais. Est-il normal que JUnit à l'aide de Printemps n'a JAMAIS vraiment persiste les données dans la base de données et le garde quelque part dans la mémoire? Et est-il un moyen de conserver toute façon, de sorte que je puisse l'utiliser pour prefilling de la base de données pour mes tests d'intégration.

Pour l'instant j'ai une solution de contournement stockage de mes données à l'aide de ce bon vieux JDBC, mais c'est sale et je pense que cela devrait fonctionner à l'aide de Printemps et surtout j'aimerais comprendre pourquoi les données ne sont pas conservées à l'aide de l'EntityManager de Printemps...

OriginalL'auteur Mathias G. | 2014-08-07