2010-08-17 3 views
6

Wir haben JUnit4 in unserer Anwendung implementiert, die den Spring-Kern & JPA mit DB2 verwendet. Wir müssen eine vollständige Funktionalität testen, die Daten aus einer Datenbank abruft und in eine andere Datenbank zusammenführt.Junit-Testfall Transaktion wird nicht ausgeführt - keine Fehler

Testfall für das Abrufen der Daten aus der 1. Datenbank geschrieben und es läuft ohne Fehler einwandfrei, aber die Datensätze werden nicht in der 2. Datenbank gespeichert.

Implementierung

Die Klasse Testcase wir die folgenden Anmerkungen enthalten sind, den Testfall im Rahmen einer Transaktion, falls erforderlich, führen zu machen

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

Bei der Anwendung wir eine Manager-Klasse haben diese auszuführen Operation mit der Methode doSynch(). Von dieser Methode wird die txStore() -Methode der crudHelper-Klasse aufgerufen, um die doStore() -Methode (in derselben Klasse) zu initialisieren und aufzurufen, um die Entität mit der Datenbank zu verbinden.

Im folgenden werden die Transaktions deklarativen durch aus diesem Testfall Logik

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

doSynch() als wie nie markiert ist es an diesem Punkt keine Transaktion benötigt und in weiteren Stufen, wie beispielsweise in CRUDHelper die Transaktion kann als ERFORDERLICH markiert werden, um sicherzustellen, dass eine Transaktion verfügbar ist.

Problem

hier, wenn wir den Testfall ausgeführt werden, die der Manager-doSynch() Methode, um die Funktionalität zu testen nennt, komplett Fluss arbeitet außer perfekt, dass Datensätze nicht zusammengeführt werden und keine Fehler geworfen werden.

Die Manager-Methode, wenn sie von einer JSP aufgerufen wird, funktioniert sehr gut. Auch getestet haben wir, indem wir txStore() direkt aus dem Testfall aufrufen und es funktioniert auch gut.

Bitte lassen Sie uns wissen, ob das Transaktionsmanagement nicht korrekt ist oder eine Lösung für dieses Problem hilfreich ist. Bitte aktualisieren Sie mich auch, wenn das Problem oder die Umgebung nicht klar ist. Danke im Voraus.!!

Antwort

6

Markieren Sie Ihre Methoden mit der @Rollback Annotation?

Vom JavaDoc:

Test-Annotation, um anzuzeigen, ob nicht die Transaktion für die kommentierten Testverfahren sollte zurück gerollt werden, nachdem das Testverfahren abgeschlossen ist. Wenn dies der Fall ist, wird die Transaktion zurückgesetzt. Andernfalls wird die Transaktion festgeschrieben.

+0

Danke 4 ur Antwort. Wir haben den defaultRollback-Wert in der TestCase-Klassenstufe als false festgelegt und keinen anderen Rollback für die Methodenstufen erhalten. Aber nur so funktioniert es, indem @Transactional zur Methode doStore() hinzugefügt wird. Wir können insert-Abfragen nur in diesem Fall gedruckt sehen, und doStores Annotation ist remove, nicht einmal eine einzige Einfüge-Abfrage wird gedruckt, wenn em.merge() aufgerufen wird. Aber wir konnten das nicht ändern, wie es in unserer Freezed-Framework-Klasse ist. Jede Hilfe wäre nennenswert. !! – raksja

Verwandte Themen