2012-08-09 10 views
12

Ich kann Frühling zum Erstellen und Embedded-Datenbanken initialisieren entweder programmatisch:Wie verwende ich Spring eingebettete Datenbankinitialisierungsskripte während der Integrationstestphase?

@Before 
public void setUp() { 
    database = new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.H2) 
      .addScript("schema.sql") 
      .addScript("init.sql") 
      .build(); 
    .... 
} 

oder über Spring-Konfiguration:

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:schema.sql"/> 
    <jdbc:script location="classpath:init.sql"/> 
</jdbc:initialize-database> 

Hier meine Skripte schema.sql und init.sql im Verzeichnis src/test/resources gespeichert sind. Also, wenn Tests die eingebettete databse verwenden laufen mit:

mvn test 

dann die Dateien, in src/test/resources sein verfügbar sind, und alles ist in Ordnung.

Aber jetzt nehme ich will zusammen die eingebettete Datenbank stattdessen verwenden mit einem eingebetteten Webserver (Jetty oder eingebettet Tomcat) in einem Integrationstest, lief über

mvn integration-test 

Jetzt in dieser späten Phase I Ich möchte einen fast End-to-End-Test durchführen, bei dem bestimmte URLs für den Webdienst die erwarteten HTTP-Antworten zurückgeben, wobei bestimmte Daten in der eingebetteten Datenbank vorausgesetzt werden. Aber an diesem Punkt, die im eingebetteten Webserver eingesetzt Krieg hat keine Dateien von src/test/resources so mein Initialisierungsskripts nicht vorhanden ist, und ich erhalte die Fehler

Verursacht durch: java.io.FileNotFoundException: Klassenpfad Ressource [ schema.sql] kann nicht geöffnet werden, da es nicht

Jetzt ist alles existiert wird Arbeit, wenn ich die Skripte in src/main/resources setzen, aber diese Skripte sind nur für eine eingebettete Datenbank für Testen Auffüllen und sie es nicht tun gehören in der Kriegsdatei überhaupt. Weiß jemand, wie man einen Integrationstest einrichtet, so dass eine emedded Datenbank verwendet werden kann, ohne die tatsächliche Kriegsakte zu verschmutzen, die eingesetzt wird?

Ich hatte gehofft, dass Spring eingebettete Datenbank Initialisierung könnte etwas anderes als eine Datei verwenden. Ich dachte über JNDI nach, aber das würde bedeuten, dass ich die Datei web.xml mit einer Ressourcendefinition für Testdaten verschmutzen müsste, die (wieder) im entfaltbaren Krieg erscheinen würden. Oder vielleicht gibt es Optionen mit Fracht? Einige programmatische Tricks mit Spring, die ich nicht kenne?

Antwort

5

sollten Sie in der Lage sein, dies zu tun:

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="file:///${project.basedir}/src/test/resources/schema.sql"/> 
    <jdbc:script location="file:///${project.basedir}/src/test/resources/init.sql"/> 
</jdbc:initialize-database> 
+1

$ {project.basedir} - Kann maven werden Variablen innerhalb Feder Kontext verwendet? –