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
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe est une combinaison de la JPA qui fonctionne et ce qui Ressort n'lors de la transaction en cours d'exécution des tests.
D'abord, JPA lorsqu'une entité est conservé dans JPA, cela ne signifie pas que les données sont conservées dans la base de données. Habituellement, les données seront poussés à la base de données lors de la transaction en cours s'engage, ou lorsque vous videz le gestionnaire d'entités.
Découvrez cette DONC réponse parmi les nombreux que vous pouvez trouver avec une simple recherche google.
Deuxième, quand le Printemps s'exécute un test qui est annoté avec
@Transactional
, alors par défaut, il annulera la transaction lorsque le test est terminé. Vérifier cette de nombreux problèmes semblables. Afin de remplacer ce comportement par défaut, vous devez utiliser@Rollback(false)
.Les données sont écrites sur le fichier lors de l'utilisation de JDBC, parce que vous exécutez les instructions à l'extérieur de la Transaction, le Printemps a créé pour le test et, par conséquent, la valeur par défaut de la fonction restauration a pas de données permettant de revenir.
Cela fonctionne aussi bien, mais vous devriez vérifier ceci avant de l'utiliser
OriginalL'auteur geoand
Ajouter @s'Engager, au niveau de la classe ou au niveau de la méthode. Vérifier cette
OriginalL'auteur Xiao Peng - ZenUML.com