2016-01-05 3 views
14

My Frühlings-Boot-Mvc-Webanwendung hat die folgende Datenbankkonfiguration in application.properties Datei:Wie neu Datenbank vor jedem Test im Frühjahr erstellen?

spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk 
spring.datasource.username=sa 
spring.datasource.password= 
spring.datasource.driver-class-name=org.h2.Driver 

dies die einzige config habe ich. Keine anderen Konfigurationen von mir irgendwo gemacht. Nichtsdestotrotz erstellen die Spring- und Subsysteme automatisch eine Datenbank bei jedem Webanwendungslauf neu. Die Datenbank wird neu erstellt, nämlich auf dem Systemlauf, während sie Daten enthält, nachdem die Anwendung beendet wurde.

Ich habe diese Standardwerte nicht verstanden und erwartet, dass dies für Tests geeignet ist.

Aber als ich anfing, Tests auszuführen, fand ich, dass Datenbank nur einmal neu erstellt wird. Da Tests in keiner vordefinierten Reihenfolge ausgeführt werden, ist dies überhaupt sinnlos.

So ist die Frage: , wie man irgendeinen Sinn macht? I.e. Wie man die Datenbank vor jedem Test neu erstellen lässt, wie es beim ersten Start der Anwendung passiert?

Mein Test-Klasse-Header folgt:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = myapp.class) 
//@WebAppConfiguration 
@WebIntegrationTest 
@DirtiesContext 
public class WebControllersTest { 

Wie Sie sehen, habe ich versucht @DirtiesContext auf Klassenebene und es hat nicht geholfen.

UPDATE

Ich habe eine Bohne

@Service 
public class DatabaseService implements InitializingBean { 

, die ein Verfahren

@Override 
    @Transactional() 
    public void afterPropertiesSet() throws Exception { 
     log.info("Bootstrapping data..."); 
     User user = createRootUser(); 
     if(populateDemo) { 
      populateDemos(); 
     } 
     log.info("...Bootstrapping completed"); 
    } 

Jetzt ist es mir gemacht populateDemos() Methode zum Löschen aller Daten aus der Datenbank hat. Leider ruft es trotz @DirtiesContext nicht vor jedem Test an. Warum?

+0

Dies ist benutzerdefinierte Logik. Spring weiß nichts über Ihre Datenbank (en). Schreibe ein '@ Before' und' @ After' zum Einrichten und Aufräumen. –

+0

@StiriosDelimanolis Ich weiß, es ist kurz, aber sollte dein Kommentar keine Antwort sein? –

+0

@JimGarrison Eh, Community-Wiki. –

Antwort

27

tatsächlich, ich glaube, Sie dies wünschen:

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

@DirtiesContext kann als Annotation auf Klassenebene und Methodenebene innerhalb derselben Klasse verwendet werden. In solchen Szenarien wird der ApplicationContext nach einer solchen annotierten -Methode sowie nach der gesamten Klasse als schmutzig gekennzeichnet. Wenn der DirtiesContext.ClassMode auf AFTER_EACH_TEST_METHOD festgelegt ist, wird der Kontext nach jeder Testmethode in der Klasse als schmutzig gekennzeichnet.

2

Es sei denn, Sie verwenden eine Art von Spring-Data-Integration (die ich überhaupt nicht kenne), scheint dies benutzerdefinierte Logik zu sein, die Sie selbst implementieren müssen. Spring kennt Ihre Datenbanken, Schemas und Tabellen nicht.

Angenommen, JUnit, schreiben Sie entsprechende @Before und @After Methoden zum Einrichten und Bereinigen Sie Ihre Datenbank, ihre Tabellen und Daten. Ihre Tests können selbst die Daten schreiben, die sie benötigen, und möglicherweise nach Bedarf selbst bereinigen.

+0

Aber wer löscht die Datenbank gerade beim Programmstart? Wenn die Logik benutzerdefiniert ist, warum löscht sie dann bereits die Datenbank ohne meine expliziten Befehle? – Dims

+0

Es ist in der Speicher-Datenbank - es ist nicht gelöscht, es ist erstellt und so ist es leer ... – Betlista

+0

Es ist nicht in der Speicher-Datenbank, da URL ist 'dbc: h2: tcp: // localhost/~/pdk'. Es ist eine echte Datenbank, und ich kann die Datei sehen und auf sie getrennt von den Datenbank-Tools zugreifen. Es wird wahrscheinlich durch die zugrunde liegende Hibernate-Standardkonfiguration gelöscht, die auf 'create' oder' drop-create' gesetzt ist. Die Frage ist, ob es möglich ist, nicht explizit reinitialisierend zu treten ... – Dims

2

Wenn Sie spring.jpa.hibernate.ddl-auto=create-drop verwenden, sollte genug sein, um Datenbank zu erstellen/löschen?

+0

Dies wird wahrscheinlich standardmäßig von Spring verwendet, was nicht ganz klar ist warum. – Dims

6

die Datenbank erstellen Sie müssen tun, was die anderen Antworten sagen, mit dem spring.jpa.hibernate.ddl-auto=create-drop, jetzt, wenn Sie Ihre Absicht, die Datenbank auf jedem Test pupulate ist dann bietet Feder ein sehr nützliches den Vermerk

@Transactional(value=JpaConfiguration.TRANSACTION_MANAGER_NAME) 
@Sql(executionPhase=ExecutionPhase.BEFORE_TEST_METHOD,scripts="classpath:/test-sql/group2.sql") 
public class GroupServiceTest extends TimeoffApplicationTests { 

, die aus ist Dieses Paket org.springframework.test.context.jdbc.Sql; und Sie können eine Vorher-Test-Methode und eine After-Test-Methode ausführen. Um die Datenbank zu füllen.

in Bezug auf die Datenbank jedes Mal zu schaffen, sagen Sie nur Ihre Test-wollen die create-Drop-Option haben Sie Ihre Tests mit benutzerdefinierten Eigenschaften mit dieser Anmerkung konfigurieren

@TestPropertySource(locations="classpath:application-test.properties") 
public class TimeoffApplicationTests extends AbstractTransactionalJUnit4SpringContextTests{ 

Hoffe, es hilft

Verwandte Themen