/ / Spring-Startanwendung mit DB - Die Testklasse schlägt fehl, nachdem der Kontext mit @DirtiesContext wiederhergestellt wurde - java, junit, spring-boot, spring-test

Spring-Boot-Anwendung mit DB - Test-Klasse schlägt fehl, nachdem der Kontext mit @DirtiesContext neu erstellt wurde - java, junit, spring-boot, spring-test

Ich versuche, eine Reihe von JUnit4-Testklassen einer Spring Boot-Anwendung auszuführen, die aus mehreren Webdiensten besteht und eine Datenbank konfiguriert hat.

Es ist praktisch, dass der Kontext nach jedem Test gelöscht wird. Daher habe ich eine @DirtiesContext-Annotation für jede Testklasse eingefügt, weil das Standardverhalten dieser Annotation auf AFTER_CLASS gesetzt ist.

Das Problem, das ich bekomme, ist, dass die erste Testklasse gut funktioniert, aber dann die folgenden immer scheitern.

Also habe ich 2 einfache JUnit-Klassen erstellt, um das Problem anzugehen. Beide sind gleich und die Testmethode ist leer, also sollte immer Erfolg zurückgegeben werden:

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import urlshortener2014.goldenbrown.Application;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest("server.port=0")
@DirtiesContext
public class ApplicationTests {

@Value("${local.server.port}")
private int port = 0;

@Test
public void testAlwaysOk() throws Exception {

}
}

Ich habe beide Testklassen durchgeführt(ApplicationTests und SameApplicationTests) innerhalb von Eclipse und durch "grddle test" und in beiden Fällen scheitern die zweite und folgende Testklassen, nachdem der Kontext bereinigt wurde.

Ich vermute, dass das Problem mit der Datenbank der Anwendung zusammenhängt, das nicht korrekt neu erstellt wird, da der Ausgabe-Trace mehrmals auf datenbankbezogene Fehler zeigt. Aber ich bin mir nicht sicher, wie oder warum das passiert und wie ich es beheben kann.

Hier ist ein Gist mit "grddle test" Ausgaben (normale Ausgabe, --info Ausgabe und - debug Ausgabe): https://gist.github.com/jgbarcos/c8b34c5c292ca1fabc1d

Hier ist die build.gradle (gemacht, um nur die 2 einfachen Klassen zu testen), die verwendet wird:

eclipse {
project {
name = "UrlShortener2014.goldenBrown"
}
}

dependencies {
compile project(":common")
// Provides java script libraries for static content
compile("org.webjars:bootstrap:3.0.3")
compile("org.webjars:jquery:2.0.3-1")
compile "org.apache.httpcomponents:httpclient:4.3.6"
compile "nl.bitwalker:UserAgentUtils:1.2.4"
compile "org.springframework:spring-context"
compile "org.springframework:spring-context-support"
compile "net.sf.ehcache:ehcache:2.7.4"
compile("org.springframework.boot:spring-boot-starter-web:1.2.0.RELEASE")
compile "org.springframework:spring-test:4.1.4.RELEASE"
testCompile "junit:junit:4.10"
}

// Used for @DirtiesContext problem
test{
scanForTestClasses = false
// This should get only "ApplicationTests.class" and "SameApplicationTests.class"
include "**/*ApplicationTests.class"
}

Hier ist der GitHub-Zweig, den ich erstellt habe, um das Problem mit dem Team-Projektordner (goldenBrown) zu reproduzieren: https://github.com/jgbarcos/UrlShortener2014/tree/debug_branch/goldenBrown

(Hinweis: Projekt hängt von einem anderen Projekt namens Common in einem anderen Ordner ab: "/ common" statt "/ goldenBrown", das könnte ein bisschen knifflig sein)

Hoffe dies hilft, das Problem zu verstehen, danke im Voraus.

Antworten:

2 für die Antwort № 1

Ihr Code ist in Ordnung. Der Fehler ist in schema-hsqldb.sql. Fügen Sie einfach die folgenden zwei Zeilen am Anfang der Datei hinzu:

DROP TABLE CLICK IF EXISTS;
DROP TABLE SHORTURL IF EXISTS;

Dadurch wird sichergestellt, dass bei jeder Neuerstellung der Datenbank vorhandene Tabellen gelöscht werden.