2015-04-17 5 views
5

Ich habe eine Spring Boot-Anwendung mit Spring Data Rest und ich verwende @WebIntegrationTest zusammen mit der TestRestTemplate in meiner Integration Tests. Die Basisklasse für die Tests sieht ungefähr so ​​aus:Spring Boot @WebIntegrationTest und TestRestTemplate - Ist es möglich, Testtransaktionen rückgängig zu machen?

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration 
@WebIntegrationTest("server.port: 0") 
public abstract class IntegrationTest { 

    ... 

} 

Ich teste die Schaffung eines Unternehmens durch die TestRestTemplate mit einer POST Anforderung an eine Ressource auszuführen. Das Problem besteht darin, dass die Transaktion, die die Entität in der Datenbank persistent hält, nicht zurückgesetzt wird, obwohl meine Tests als transaktional konfiguriert sind, sodass die Entität nach dem Test in der Datenbank verbleibt. Ich verstehe das, weil die Transaktion, die im Test rückgängig gemacht wird, nicht die selbe ist, die die Entität fortsetzt.

Jetzt ist meine Frage, gibt es eine Möglichkeit, die Transaktionen, ausgelöst durch die Anfragen, die durch die RestTemplate in einer Testmethode ausgelöst werden, zurückzurollen?

+1

ich nicht sagen würde, wäre die einzige Möglichkeit, die zusätzlichen Einträge ... –

+0

FYI manuell löschen sein: Sie können sicher löschen die Deklaration '@ TransactionConfiguration': Sie hat hier keine Wirkung. –

Antwort

16

ist es eine Möglichkeit, die Transaktionen von Fahrzeugen durch die Anträge durch die RestTemplate in einem Testverfahren ausgelöst zurück?

Nein. Es ist nicht möglich, die von der implementierten Anwendung verwalteten Transaktionen rückgängig zu machen.

Wenn Sie Ihre Testklasse mit @WebIntegrationTest und @SpringApplicationConfiguration annotieren, startet Spring Boot einen eingebetteten Servlet-Container und stellt Ihre Anwendung darin bereit. In diesem Sinne laufen Test und Anwendung in zwei verschiedenen Prozessen.

Das Spring TestContext Framework verwaltet nur Test-managed transactions. Daher beeinflusst das Vorhandensein von @Transactional in Ihrer Testklasse nur lokale testverwaltete Transaktionen, nicht die in einem anderen Prozess.

Wie bereits erwähnt, würde eine Umgehung den Zustand der Datenbank zurücksetzen, sobald der Test abgeschlossen ist. Dafür haben Sie mehrere Möglichkeiten. Einzelheiten finden Sie im Abschnitt Executing SQL scripts des Referenzhandbuchs.

Grüße,

Sam (Autor des Frühlings Testcontext Rahmen)

+0

Danke für die Hilfe Sam. Ich nahm an, das war die Antwort. Ich setze bereits den Datenbankstatus zurück. Prost. –

+0

Eine letzte Frage. Wenn der Test und die Anwendung in zwei verschiedenen Prozessen ausgeführt werden, wie ist es möglich, seine Komponenten noch in die Testklasse zu injizieren? –

+0

Wenn ich sagte _different process_, das war vielleicht ein bisschen irreführend. Der eingebettete Container und Ihr Test werden im selben JVM-Prozess ausgeführt. Der eingebettete Servlet-Container führt jedoch Anforderungen in verschiedenen Threads aus seinem eigenen Thread-Pool natürlich aus. Da die Transaktionsunterstützung von Spring auf 'ThreadLocal' basiert, ist der Begriff der unterschiedlichen Threads bei Transaktionsgrenzen wichtig. Der 'ApplicationContext' wird jedoch im Thread des Tests gestartet. So können Komponenten aus dem Kontext in den Test eingefügt werden, selbst wenn diese Komponenten in den Threads des Containers ausgeführt werden. –

Verwandte Themen