wake-up-neo.net

Verwenden Sie die eingebettete Datenbank für den Test im Springboot

Ich habe eine Spring-Boot-Anwendung, sie verfügt über ein paar @Entity-Klassen und @RepositoryRestResource-Repositort-Schnittstellen. Jetzt möchte ich einige Tests schreiben, in denen ich überprüfen kann, ob ich mithilfe dieser Repositorys einen neuen Datensatz in meine Datenbank einfügen kann. Ich möchte jedoch nicht meine konfigurierte MySQL-Datenbank dafür verwenden, sondern eine eingebettete Datenbank wie H2. Im Moment habe ich eine application.properties-Datei, die wie folgt aussieht:

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=qwerty123

Frage: Wie konfiguriere ich meine App für die Verwendung anderer Datenbanken für Tests? Ich habe kein XML in meinem Projekt, alles basiert auf Annotationen. Ich habe versucht, @Configuration class mit @Bean zu definieren, um DataSource zu erstellen, und es dann mit @ContextConfiguration annotation für die Testklasse zu verwenden, aber es sagt, dass es keinen Kontext laden kann.

7
Leonid Bor

Wenn Sie ein Maven-Projekt verwenden, können Sie eine application.properties-Datei in Ihren src/test/resources einfügen, beispielsweise mit dem folgenden Inhalt.

# Create DDL
spring.jpa.hibernate.ddl-auto=create

# H2 in local file system allowing other simultaneous connections
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE

Außerdem müssen Sie H2 als Abhängigkeit angeben (pom.xml):

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>1.4.193</version>
</dependency>
14
Boni García

Spring Boot bietet zwei magische Anmerkungen zu JPA-Autokonfigurationen für Tests: @DataJpaTest und @AutoConfigureTestDatabase. Der Javadoc sagt:

Tests, die mit @DataJpaTest kommentiert wurden, verwenden standardmäßig ein eingebettetes In-Memory-Datenbank (ersetzt explizite oder normalerweise automatisch konfigurierte DataSource). Die Annotation @AutoConfigureTestDatabase kann für .__ verwendet werden. überschreiben Sie diese Einstellungen.

Wenn Sie Ihre vollständige Anwendungskonfiguration laden möchten, aber Verwenden Sie eine eingebettete Datenbank, sollten Sie @SpringBootTest in Kombination betrachten mit @AutoConfigureTestDatabase anstelle dieser Anmerkung.

Das einzige, was Sie absolut brauchen, ist eine Abhängigkeit in Ihrer POM-Datei:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

Das ist es. Spring Boot Spec hat jedoch auch zwei nützliche Hinweise:

Sie müssen keine Verbindungs-URLs angeben. Sie müssen nur ein .__ angeben. Abhängigkeit von der eingebetteten Datenbank erstellen, die Sie verwenden möchten . Wenn Sie diese Funktion in Ihren Tests verwenden, stellen Sie möglicherweise fest, dass die Dieselbe Datenbank wird von Ihrer gesamten Testsuite unabhängig von der .__ wiederverwendet. Anzahl der verwendeten Anwendungskontexte. Wenn Sie sicherstellen möchten, dass Da jeder Kontext eine eigene eingebettete Datenbank hat, sollten Sie .__ einstellen. spring.datasource.generate-unique-name auf true.

Und noch einer:

Wenn Sie aus irgendeinem Grund die Verbindungs-URL für eine .__ konfigurieren. eingebettete Datenbank, stellen Sie sicher, dass die Datenbank automatisch Das Herunterfahren ist deaktiviert. Wenn Sie H2 verwenden, sollten Sie .__ verwenden. DB_CLOSE_ON_EXIT = FALSE, um dies zu tun. Wenn Sie HSQLDB verwenden, sollten Sie sicherstellen, dass dass shutdown = true wird nicht verwendet. Automatisches Deaktivieren der Datenbank Mit shutdown lässt sich Spring Boot steuern, wenn die Datenbank geschlossen wird, und damit Sicherstellen, dass dies geschieht, sobald der Zugriff auf die Datenbank nicht mehr besteht erforderlich.

Das ist fast alles, was Sie über Spring Boot und Embedded DBs wissen müssen. Ich sehe absolut keinen Grund, den Abhängigkeitsbereich anders als test zu verwenden, es sei denn, Sie konfigurieren tatsächlich eine eingebettete Datenbank für Ihre Anwendungslaufzeit. Ob Sie es glauben oder nicht: H2-Glas allein benötigt 1,8 M in Ihrem fetten Glas. In der Welt der granularen Microservices, Serverless- und Lambda-Funktionen spielt es eine Rolle, was Sie in Ihre Apps stecken.

Ich würde auch empfehlen, die Optionen in @AutoConfigureTestDatabase zu überprüfen. Ich verwende es mit @SpringBootTest, aber es kann auch mit einigen anderen Annotationen verwendet werden, nämlich @DataJpaTest, die beide oben erwähnt wurden:  enter image description here

6
yuranos87

Sie müssen Spring-Profile verwenden - https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-set-active-spring- Profile

Sie definieren ein aktives Profil, indem Sie "spring.profiles.active = development" verwenden und anschließend H2 in Ihr Entwicklungsprofil aufnehmen.

Die Beispiele verwenden YAML, sie funktionieren jedoch auch in Standardeigenschaftendateien.

2