3 Stimmen

Spring Transaction Management Test

Ich möchte meine Dao-Klasse mit den SpringContextTests testen.
In meiner Methodenklasse habe ich die AbstractTransactionalJUnit4SpringContextTests damit meine Testklasse mit JUnit4 integriert werden kann. Ich habe auch die Konfigurationen eingerichtet und die Initialisierung und Datenbankbereinigung in der @Before und tearDown in der @After . Meine Testklasse funktioniert perfekt.

Mein Problem war, wenn ich meine Testklasse ausführe und die Datenbank mit Daten gefüllt wird, wurden die ursprünglichen Daten nicht zurückgerollt und meine Datenbank wird geleert. In der @Before Methode lösche ich die Datenbank und fülle die Daten auf, wobei ich denke, dass ich in der Lage sein werde, es wiederherzustellen, aber das ist nicht der Fall.

Kann jemand ein Beispiel nennen, das funktioniert und die Informationen in der Datenbank zurücksetzt?

ADDONS:
Jede Datenbankmanipulation in meinen Testmethoden wird rückgängig gemacht. Aber die Ausführung von super.deleteFromTables("person") en el @Before Methode nicht alle vorherigen Daten aus der Datenbank wiederhergestellt hat.

Spring rollt alle CRUD-Operationen zurück, aber die Datenbankbereinigung vor der Transaktion wird nicht zurückgesetzt.

0voto

Gareth Davis Punkte 27204

Während ich mit dem Kerl zustimmen würde, der eine dezidierte Datenbank zum Testen vorschlägt, gibt es keinen Grund, warum die Verwendung einer bevölkerten Datenbank nicht funktionieren sollte, werden sowohl @Before- als auch @After-Methoden innerhalb des Transaktionskontextes ausgeführt, daher sollten Änderungen rückgängig gemacht werden.

Die Möglichkeiten:

  • Die Dateneinrichtung führt etwas durch, das nicht transaktional ist (z. B. DDL-Anweisungen).
  • Irgendetwas in Ihrem Test überträgt die Transaktion tatsächlich

Können Sie die @Before-Methode posten, ich frage mich nur, ob Sie gerade die Tabellen löschen oder tatsächlich fallen lassen und neu erstellen?

0voto

Michael Wiles Punkte 20303

Soweit ich das beurteilen kann, müssen Sie, wenn Sie sich die Javadocs und den Quellcode von AbstractJUnit4SpringContextTests und TransactionalTestExecutionListener ansehen, Ihre Testmethoden, die Sie transaktionalisieren möchten, mit @Transactional annotieren.

Es gibt auch @BeforeTransaction- und @AfterTransaction-Annotationen, mit denen Sie besser steuern können, was in einer Transaktion läuft.

Ich schlage vor, dass Sie Methoden erstellen, die mit all diesen Annotationen, einschließlich @Before, versehen sind, und dann den Test mit Haltepunkten an diesen Methoden ausführen. Auf diese Weise können Sie sich den Stack ansehen und herausfinden, ob Spring eine Transaktion für Sie gestartet hat oder nicht. Wenn Sie dann etwas wie "TransactionInterceptor" im Stack sehen, oder irgendetwas anderes mit "Transaction" im Namen, dann stehen die Chancen gut, dass Sie sich in einer Transaktion befinden.

0voto

Sie führen super.deleteFromTables in Ihrer @Before-Methode aus, die sich innerhalb des tx befindet. Wenn also der tx zurückgerollt wird, werden dann nicht auch die Löschungen zurückgerollt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X