wake-up-neo.com

Konfigurieren Sie bestimmte in der Speicherdatenbank zu Testzwecken in Spring

Wie konfiguriere ich meine Spring Boot-Anwendung so, dass beim Ausführen von Komponententests In-Memory-Datenbanken wie H2/HSQL verwendet werden, beim Ausführen der Spring Boot-Anwendung jedoch die Produktionsdatenbank [Postgre/MySQL]?

38
IllSc

Hierfür können Federprofile verwendet werden. Dies wäre ein spezifischer Weg:

Haben Sie umgebungsspezifische Eigenschaftendateien:

application.properties:

spring.profiles.active: dev

application-dev.properties

spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: update

spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password

application-test.properties

spring.jpa.database: HSQL

Haben Sie beide MySQL und H2 Treiber in pom.xml, so was:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>test</scope>
</dependency>

Kommentieren Sie als letztes die Testklassen mit @ActiveProfiles("test").

51
Sanjay

Ein anderer Ansatz ist das Hinzufügen der Anmerkung @AutoConfigureTestDatabase Sie testen Klasse. Meine Tests sehen normalerweise so aus:

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class MyRepositoryTest {

    @Autowired
    MyRepository repository;

    @Test
    public void test() throws Exception {
        // Tests...
    }
}
28
ronhash

@Sanjay hat einen Weg, es auszudrücken, aber ich finde es verwirrend. Sie könnten genauso gut nur ein production -Profil haben, das Sie aktivieren, wenn Sie in der Produktion sind.

spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password

Und nichts anderes angeben. Wenn Sie eine eingebettete Datenbank im Bereich test hinzufügen, ist diese in Ihren Tests verfügbar. Wenn Sie Ihre Tests mit dem Standardprofil ausführen (überhaupt keine Anpassung), werden keine Datenbankinformationen gefunden (da diese im Profil production gespeichert sind). In diesem Fall wird versucht, eine eingebettete Datenbank zu finden und für Sie zu starten. Wenn Sie aus irgendeinem Grund weitere Anpassungen benötigen, können Sie einen application-test.properties Für diese festlegen (Sie müssen ActiveProfiles("test") zu Ihren Tests hinzufügen).

6
Stephane Nicoll

Einfachste Lösung:

1) in src/main/resources haben application.properties (production config):

spring.datasource.url=jdbc:mysql://localhost:3306/somedb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect

und application-test.properties mit HSQL config wie:

spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.database = HSQL
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect
spring.datasource.driverClassName = org.hsqldb.jdbcDriver
spring.datasource.url= jdbc:hsqldb:mem:scratchdb
spring.datasource.username = sa
spring.datasource.password =

2) Fügen Sie eine HSQL-Abhängigkeit in pom.xml hinzu, falls Sie diese noch nicht haben.

3) Kommentieren Sie Ihre Testklasse mit @ActiveProfiles ("test").

Arbeitete wie Charme in meinem Fall.

5
jarosik

Einfache Lösung, wenn Sie mit maven bauen: Platzieren Sie einfach ein application.properties Datei unter src/test/resources und nach Bedarf zum Testen bearbeiten.

Der Spring (Boot) Profile-Mechanismus ist ein ziemlich leistungsfähiges Tool, das weit über das "Austauschen von Einstellungen zwischen Testzeit und Laufzeit" hinausgeht. Obwohl, klar, wie gezeigt, kann es das auch :)

5
demaniak

Mit @SpringBootTest magic müssen Sie nur zwei Änderungen durchführen.

  1. Fügen Sie 'h2' Testabhängigkeit in pom.xml hinzu
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
  1. Verwenden Sie @ AutoConfigureTestDatabase
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApplication.class)
@AutoConfigureTestDatabase
public class SpringBootTest{

    @Autowired
    private RequestRepository requestRepository;
}

Jetzt verwenden alle im Test verwendeten Spring-JPA-Beans/-Repositorys h2 als Backup-Datenbank.

2019-04-26 13: 13: 34.198 INFO 28627 --- [main] beddedDataSourceBeanFactoryPostProcessor: 'dataSource' DataSource-Bean durch eingebettete Version ersetzen

2019-04-26 13: 13: 34.199 INFO 28627 --- [main] o.s.b.f.s.DefaultListableBeanFactory: Überschreiben der Bean-Definition für Bean 'dataSource'

2019-04-26 13: 13: 36.194 INFO 28627 --- [main] osjdeEmbeddedDatabaseFactory: Eingebettete Datenbank wird gestartet: url = 'jdbc: h2: mem: 2784768e-f053-4bb3-ab88-edda34956893; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_ = false ', Benutzername =' sa '

Hinweis: Ich habe immer noch 'spring-jpa'-Eigenschaften, die in' application.properties 'definiert sind, und ich verwende keine Profile. @ AutoConfigureTestDatabase überschreibt vorhandene JPA-Konfigurationen mit den Teststandards AutoConfigureTestDatabase.Replace.

1
147.3k