2016-07-08 16 views
7

Używam JUnit do przetestowania mojej aplikacji i wszystko działa poprawnie, dopóki baza danych została zainicjowana przed testowaniem (przy użyciu gradle bootRun do uruchomienia jako aplikacja internetowa). Jeśli jednak baza danych jest pusta, aplikacja nie wydaje się inicjować żadnych modeli ani jednostek przed testowaniem. Czy jest sposób, w jaki powinienem to zrobić? Założyłem, że klasa ApplicationRunner zostanie uruchomiona przed testem i zainicjalizuje elementy. Czy istnieje sposób, aby to zrobić, czy też używam niewłaściwego podejścia?Inicjowanie bazy danych przed testem Spring Boot

To jest jak mój plik application.properties patrzy jak:

server.port=8090 
server.ssl.key-store=classpath:keystore.jks 
server.ssl.key-store-password=123456 
server.ssl.key-password 123456 
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect 
spring.jpa.hibernate.ddl-auto=create 
spring.jpa.hibernate.naming-strategy:org.hibernate.cfg.ImprovedNamingStrategy 
application.logger.org.springframework=INFO 

są przechowywane w bazie Moja /src/main/java/application/persistence/DbConfig.java użyciu DriverManagerDataSource połączenia. I mam ustawienie ApplicationRunner, aby uruchomić dodać kilka wierszy do bazy danych po uruchomieniu.

edit:

Należy również dodać, że są to adnotacje używam na pliku testowego JUnit:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes={ 
    AdeyTrackApplication.class, 
    SecurityConfig.class, 
    WebConfig.class, 
    AuthorizationController.class 
    }) 
+0

Pierwszym sposobem jest zainicjowanie bazy danych w metodzie "setUp" w klasie testowej. Innym sposobem jest utworzenie konfiguracji testowej, w której dodaje się funkcję '@ PostConstruct', która inicjuje dane w bazie danych i dodaje tę klasę do' ContextConfiguration'. – krynio

+0

@krynio jest przykładem implementacji tego? Nie jestem bardzo doświadczony w Spring i nie natknąłem się na tę adnotację w odniesieniu do JUnit. – px06

+0

Najprostszy sposób to wstrzyknąć JdbcTemplate do swojej klasy testowej. Następnie możesz wykonać kwerendę sql przy użyciu 'jdbcTemplate.execue (sql)'. Aby uruchomić ten kod przed każdym testem, powinieneś stworzyć metodę 'setUp' z adnotacją' @ Before'. Oto przykład jak wstrzyknąć JdbcTemplate i wykonać zapytanie: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-flyway/src/test/java /sample/flyway/SampleFlywayApplicationTests.java i tutaj jest przykładem użycia '@ Before' http: // junit.sourceforge.net/javadoc/org/junit/Before.html – krynio

Odpowiedz

-1

Powyższe odpowiedzi wszystkim wykorzystać technikę .sql schemat ładowania gdzie będę mieć .sql schematu dla testów. Nie chciałem tego robić w ten sposób, ponieważ mój schemat będzie się rozszerzał i wolałbym nie kłopotać się dodawaniem wpisów do schematu, gdy moje testy rozszerzają się.

Podczas korzystania ze Spring Boot natknąłem się na tę adnotację, która wydaje się rozwiązywać problem, uruchamiając najpierw bootRun, a następnie uruchamiając testy.

W moich adnotacjach testowych zastąpiłem @ContextConfigurations z @SpringApplicationConfiguration i pozostawiłem wszystkie klasy tak, aby były takie same. To wydawało się rozwiązać problem. Teraz zadanie test wywołuje bootRun w celu załadowania klas i , a następnie uruchamia testy.

Zobacz @SpringApplicationConfiguration

Hop to pomaga ktoś stoi ten sam problem.