2014-01-21 7 views
9

Um die Unabhängigkeit zwischen den JUnit-Tests zu erhalten, muss ich die Datenbank zu Beginn jedes Tests erstellen und sie am Ende jedes Tests zerstören.Spring + JUnit + H2 + JPA: Ist es möglich, die Datenbank für jeden Test zu löschen?

Die Datenbank sollte im Speicher (H2-Datenbank) erstellt werden, indem SQL-Abfragen ausgeführt werden, die in einer SQL-Datei vorhanden sind (Native Abfragen einfügen ...).

Definieren meiner Schlüssel-Werte in einer Eigenschaftendatei und respektieren JPA-Spezifikation (persistence.xml), wie kann ich erstellen-Drop-Datenbank für jeden JUnit-Test mit Anmerkungen/Injektionen?

Vielen Dank!

+0

Ich habe die beschriebene Anordnung mit Arquillian arbeiten, aber mit JBoss 7.1.1 anstelle von Spring und Hibernate als JPA impl. Wenn Sie Arquillian mit Spring benutzen können, lassen Sie es mich wissen. – kostja

Antwort

25

Sie sollten in der Lage Spring eingebettete Datenbank-Konfiguration zu verwenden, um eine H2-Datenquelle angeben (auch here dargestellt):

<jdbc:embedded-database id="dataSource" type="H2"> 
    <!-- Modify locations appropriately for your environment --> 
    <jdbc:script location="classpath:db-schema.sql"/> 
    <jdbc:script location="classpath:db-test-data.sql"/> 
</jdbc:embedded-database> 

, die in Ihrem testspezifischen testApplicationContext.xml mit den entsprechenden Namespace-Deklarationen gehen sollten.

Spring erstellt die H2-Datenquelle, wenn der Kontext der Testanwendung zu Beginn der Testsuite (Testklasse) aufgerufen wird. Da Frühling den Anwendungskontext für die Dauer der Testklasse-Caches können Sie die Testklasse mit @DirtiesContext mit Anmerkungen versehen, so dass der Anwendungskontext neu erstellt und Datenquelle für jede Testmethode neu initialisiert:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:/your/testApplicationContext.xml"}) 
@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD) 
public class SomeDatabaseTest { 

    @Autowired 
    private SomeDao dao; 

    // Test methods 
} 

Mehr Infos auf Frühling eingebettete Datenbank-Funktionalität kann here

3

Sie sollten wahrscheinlich JPA oder Frühling Funktionen verwenden, aber nur der Vollständigkeit halber:

Auf der Datenbankseite, H2 unterstützt running init scripts when opening the database wie folgt:

jdbc:h2:mem:test;INIT=runscript from '~/create.sql' 

oder

jdbc:h2:mem:test;INIT=runscript from 'classpath:/com/acme/create.sql' 

Und wenn Wenn Sie In-Memory-Datenbanken schließen (wie im obigen Beispiel), werden die Daten gelöscht. Oder Sie könnten die SQL-Anweisung drop all objects ausführen.