2010-08-17 4 views
6

Nous avons implémenté JUnit4 dans notre application qui utilise Spring core & JPA avec DB2. Nous devons tester une fonctionnalité complète qui récupère les données d'une base de données et fusionne dans une autre base de données.junit test case transaction ne pas être validée - aucune erreur

Un cas de test pour récupérer les données de la première base de données est écrit et il fonctionne parfaitement sans erreur mais les enregistrements ne sont pas stockés dans la deuxième base de données.

mise en œuvre

La classe TestCase, nous avons inclus les annotations suivantes pour faire le cas de test exécuté sous une transaction si nécessaire,

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ 
     DependencyInjectionTestExecutionListener.class,  
     TransactionalTestExecutionListener.class}) 
@ContextConfiguration(locations={""}) 
@TransactionConfiguration(transactionManager="defaultTransactionManager", defaultRollback=false) 
@Transactional 

Dans l'application, nous avons une classe de gestionnaire pour effectuer cette opération avec la méthode doSynch(). À partir de cette méthode, la méthode txStore() de la classe crudHelper sera appelée pour initialiser et appeler la méthode doStore() (dans la même classe) pour fusionner l'entité à la base de données.

Après sont les déclarative des transactions à travers ce cas test de logique

TestCase testSynch() - @Transactional(propagation=Propagation.SUPPORTS) 
Manager doSynch() - @Transactional(propagation=Propagation.NEVER) 
CRUDHelper txStore() - @Transactional(propagation=Propagation.REQUIRED) 
      doStore() - No Transactional annotation 

doSynch() est marqué comme jamais aussi à ce moment, il n'a pas besoin de transaction et d'autres niveaux, comme dans CRUDHelper la transaction peut être marqué comme OBLIGATOIRE pour garantir la disponibilité d'une transaction.

Problème

ici lorsque nous courons le cas de test qui appelle la méthode doSynch() du gestionnaire pour tester la fonctionnalité, le flux complet fonctionne parfait, sauf que les dossiers ne sont pas fusionnés et aucune erreur sont jetés.

La méthode Manager, lorsqu'elle est appelée à partir d'une JSP, fonctionne très bien. Nous avons également testé en appelant txStore() directement à partir du cas de test et cela fonctionne également très bien. Veuillez nous faire savoir si la gestion des transactions n'est pas appropriée ou si une solution à ce problème vous sera d'une aide plus importante. Aussi les pls me mettent à jour si le problème ou l'environnement n'est pas clair. Merci d'avance.!!

Répondre

6

Marquez-vous vos méthodes avec l'annotation @Rollback?

De l'JavaDoc:

annotation de test pour indiquer si oui ou non la transaction pour la méthode d'essai annotée doit être annulée après la méthode d'essai est terminée. Si la valeur est true, la transaction sera annulée; sinon, la transaction sera validée.

+0

Merci pour votre réponse. Nous avons défini la valeur defaultRollback comme false au niveau de la classe TestCase et aucune autre restauration n'est proposée pour les niveaux de méthode. Mais seul le cas comment cela fonctionne est en ajoutant @Transactional à la méthode doStore(). Nous pouvons voir les requêtes d'insertion imprimées uniquement dans ce cas et l'annotation de doStore est supprimée, pas même une seule requête d'insertion est imprimée lors de l'appel à em.merge(). Mais nous ne pouvions pas faire ce changement comme il est dans notre classe de cadre gelé. Toute aide serait appréciable. – raksja