2

Wenn ich und @Transactional kombiniere, bleibt mein Test stehen und wird nie wiederhergestellt.@SpringBootTest und @Transactional bewirkt, dass der Test einfriert

Ich habe eine Demonstration des Problems here gebaut.

getAgain schlägt aufgrund einer eindeutigen Constraint-Verletzung fehl, die durch @Before verursacht wird. Um dies zu beheben, würde ich normalerweise eine @Transactional above the class hinzufügen, um meine Änderungen nach jedem Test automatisch rückgängig zu machen. Dies führt jedoch dazu, dass der Test einfriert und nie wiederhergestellt wird.

Eine Idee, warum diese beiden Anmerkungen nicht gut zusammen spielen?

+0

Weil Sie eine Sackgasse bekommen. Sie starten die vollständige Anwendung (ja, das ist, was @ SpringBootTest tut), dann fügen Sie Daten ein (aber die Transaktion ist noch offen). Dann rufst du einen Controller an, der versucht, auch eine Transaktion zu öffnen (beachte, dass ich dir gesagt habe, dass du die volle Anwendung startest), aber weil die andere Transaktion nicht beendet wurde, kann sie nicht aus der Tabelle lesen. Eine Sackgasse. –

+1

Irgendwelche Vorschläge, wie ich das lösen kann? Ich möchte meine Anwendung Ende-zu-Ende mithilfe einer eingebetteten Datenbank für einen bestimmten Datensatz testen. – Corey

Antwort

0

Alternativ können Sie auch den Einsatz von @SqlGroup machen Sie Ihre Datenbank zu initialisieren statt ResourceDatabasePopulator

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@SqlGroup({ 
     @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "/testbed.sql"), 
     @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = "/clear.sql") }) 
public class UserControllerTest { 

ich Änderungen an Ihrem Beispielprojekt vorgenommen haben und es funktioniert gut. Sie können sie hier sehen: springboottest-transactional

Verwandte Themen