2017-08-01 3 views
0

Ich habe eine Spring Boot-Anwendung, die in AWS-Umgebung ausgeführt wird. Datenbank Postgres, alle Umgebungsvariablen ausgelagert werden, so habe ich eine application.yml mit unterschiedlichen Profilen und sie lesen env Variablen wie:Wie man Spring Boot Tests mit eingebetteten db Mocking, AWS, mit Profilen, in der neuesten Spring-Version machen?

spring: 
    datasource: 
     initial-size: 5 
     url: ${MYAPI_DB_HOST} 
     username: ${MYAPI_DB_USER} 
     validation-query: SELECT 1 

Ich möchte eine eingebettete Datenbank erstellen, die alle APIs zu testen, SQL-Abfragen einschließlich . Ich folgte diesem leveluplunch Führer.

Leider hat STS durchgestrichen

@SpringApplicationConfiguration(classes = Application.class) 

als veraltet. Frühling Dokumentation empfohlen here verschiedene Anmerkungen zu verwenden:

@RunWith(SpringRunner.class) 

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 

ich JUnit lief und ich habe einen Fehler:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kmsEncryptionConfiguration': (.....) nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'aws.region' in string value "#{T(com.amazonaws.regions.Regions).fromName('${aws.region}')}"

Es ist ziemlich überraschend, da ich alle notwendigen Parameter geschrieben Konfigurationen starten/Frühjahr-Boot und Es hat in allen anderen Fällen funktioniert (einfache Lauf- und Unit-Tests bei nicht DB-abhängigen Funktionen). Wenn ich @RunWith (SpringRunner.class) durch @RunWith (SpringJUnit4ClassRunner.class) ersetze, ist das Ergebnis dasselbe. Schließlich habe ich beide auskommentiert und dann KMS Fehler nicht mehr angezeigt, aber andere Probleme verblasst:

Ich habe zwei verschiedene Fälle ausprobiert. Zuerst ruft man eine existierende API auf, die statische Werte aus application.yml (app-Version, db schemaname) beantwortet. Ich hatte genau das gleiche in einer anderen Testdatei für Controller-Tests und funktionierte gut. Der zweite ist eine klassische jdbc-Abfrage, wie es in der leveluplunch Anleitung ist.

MyProperties appProp = globalController.getMyProperties(); 
List<Map<String, Object>> resultSet = jdbcTemplate.queryForList("SELECT * FROM users WHERE userid = 1"); 

Vom stacktrace kam heraus, dass appProp war Null und die Abfrage eine Nullpointer hatte. Für mich scheint es, dass env Daten nicht einmal von application.yml gelesen werden, aber ich verstehe nicht warum. Ist die Anmerkung schlecht? Wie kann ich irgendeinen richtigen Text darüber finden, wie man es gut macht, was mir nicht ein weiteres veraltetes altes Zeug zeigt?

Antwort

0

Ich habe ein grundlegendes Beispiel zum Testen der Spring Boot API mit H2 gemacht. Es ist mit einer Postgres db verbunden. Bei maven install würde es nicht das Standardprofil von application.yml aufrufen, sondern das Testprofil, erstellt eine H2-Datenbank, fügt Tabelle ein, fügt Datensätze ein und führt Tests für sie aus.

Ich hoffe, es wird anderen Spring-Entwicklern helfen.

https://github.com/somahargitai/H2test

Verwandte Themen