2017-07-07 2 views
0

i springboot 1.5.2.RELEASE und meinen Dienst bin mit Klassen ist annoted mitWie Unit-Test-Rollback, während Service-Layer @Transactional ist

@Service 
@Transactional(rollbackFor = Exception.class) 

meiner Unit-Test-Klasse mit ist kommentiert:

@RunWith(SpringRunner.class) 
@SpringBootTest 

REQUIREMENT: Rollback in der Datenbank vorgenommenen Änderungen durch Unit-Test-Methoden nach dem Test beendet ist.

eine der vorgeschlagenen Lösungen: ist @Transactional Anmerkung über die Testklasse hinzuzufügen, habe ich versucht, es aber diese Lösung erzeugt einige Probleme, ist, dass manchmal die Testtransaktion zurückgerollt vor (auch ohne keine Ausnahmen geworfen!) Der Servicevorgang ist abgeschlossen!

kann jemand bitte eine andere gute Lösung für Rollback-Test bieten?

Antwort

1

Die Lösung mit der @Transactional in der Testklasse ist die Standardmethode dafür. Es gibt keine Möglichkeit, dass Spring Tx eine Transaktion aus heiterem Himmel rückgängig macht. Daher würde ich empfehlen, die aufgetretenen Probleme näher zu betrachten, anstatt andere Lösungen zu erfinden.

+0

vielleicht ist dies der beste Vorschlag bisher, ich werde tiefer in meine Testmethode graben, um zu sehen, was dieses Verhalten möglicherweise verursacht. –

1

Alle Änderungen werden rückgängig gemacht, wenn das Standardverhalten nicht geändert wurde. Und Sie haben keine Klassen/Methoden mit Transaktionsausbreitungsebene = REQUIRES_NEW wie es unabhängige Transaktion starten und können unabhängig voneinander oder zurückzusetzen mit der äußeren Transaktion

Rollback-Transaktion und begehen Verhalten

standardmäßig Testtransaktionen wird automatisch zurückgesetzt nach Abschluss des Tests; Das transaktionale Commit- und Rollback-Verhalten kann jedoch deklarativ über die Anmerkungen @Commit und @Rollback konfiguriert werden.

@Rollback

@Rollback zeigt an, ob die Transaktion für eine Transaktionsprüfung Methode sollte zurückgesetzt werden, nachdem das Testverfahren abgeschlossen ist. Wenn wahr ist, wird die Transaktion zurückgesetzt. Andernfalls ist die Transaktion festgeschrieben (siehe auch @Commit). Rollback-Semantik für Integrationstests im Spring TestContext Framework ist standardmäßig auf "true" gesetzt, auch wenn @Rollback nicht explizit deklariert ist.

Bei der Annotation auf Klassenebene definiert @Rollback die Standardrollback-Semantik für alle Testmethoden innerhalb der Testklasse . Wenn sie als Annotation auf Methodenebene deklariert wird, definiert @Rollback Rollback-Semantik für die spezifische Testmethode, potenziell , die @Rollback- oder @Commit-Semantik auf Klassenebene überschreibt.

+0

Seltsam, ich verwende keine Propagierung neu und das Standardverhalten ist kein Rollback, was empfehlen Sie? –

+0

1) Ich schrieb - "Und du hast nicht". 2) selbst wenn der Aufruf eine erfolgreiche Transaktion im Rollback ist, nachdem der Test beendet ist. Es ist Standardverhalten für Test. Wenn Sie speichern möchten geändert und nicht Rollback verwenden @Rollback (falsch) in Test-Klasse oder Methode – xyz

1

Vom docs:

standardmäßig Transaktionen Test automatisch zurückgerollt nach Beendigung des Tests werden; Das transaktionale Commit- und Rollback-Verhalten kann jedoch deklarativ über die Kommentare @Commit und @Rollback konfiguriert werden.

Ihr Kommentar:

manchmal die Testtransaktion zurückgerollt (! Auch ohne keine Ausnahmen geworfen), bevor der Dienst Transaktion abgeschlossen ist!

macht keinen Sinn für mich. Woher wusstest du, ob der TXN abgeschlossen oder nicht, wenn es zurückgerollt wurde? Ausnahmen sind für Tests nicht wichtig, da ich das Dokument oben zitiert habe.

+0

in der Konsole sehe ich die Protokoll: Rollback-Transaktion, und dies wird manchmal (nicht immer) protokolliert, bevor einige Methoden innerhalb meiner Unit-Test-Methode aufgerufen wird. –

+0

@MahmoudS Sind die Testdaten nach Abschluss des Tests noch in der Datenbank vorhanden oder nicht? –

+0

Wenn ich transacional in der Testklasse benutze, werden die Testdaten nicht belassen, aber wie ich schon sagte, wird der Test ohne Grund rückgängig gemacht und überspringt einige Methoden! –