2016-07-08 4 views
7

Я использую JUnit для тестирования моего приложения, и все работает нормально, пока база данных была инициализирована до тестирования (с использованием gradle bootRun для запуска в качестве веб-приложения). Однако, если база данных пуста, приложение не пытается инициализировать любые модели или объекты перед тестированием. Есть ли способ, которым я должен это делать? Я сделал предположение, что класс ApplicationRunner будет запущен перед тестированием и инициализировать объекты. Есть ли способ сделать это, или я использую неправильный подход?Инициализация базы данных до теста Spring Boot

Это как мой application.properties файл выглядит как:

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 

Моя база данных хранится в /src/main/java/application/persistence/DbConfig.java с использованием DriverManagerDataSource соединения. И у меня есть настройка ApplicationRunner, чтобы запустить добавление нескольких строк в db при запуске.

редактировать:

Я хотел бы также добавить, что эти аннотации я использую на тест JUnit файла:

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

Первый способ инициализации базы данных в методе 'setUp' в вашем тестовом классе. Другим способом является создание тестовой конфигурации, в которую вы добавляете функцию '@ PostConstruct', которая инициализирует данные в базе данных и добавляет этот класс в' ContextConfiguration'. – krynio

+0

@krynio есть пример реализации этого? Я не очень опытен с весной, и я не встречал эту аннотацию в отношении JUnit. – px06

+0

Самый простой способ - ввести JdbcTemplate в ваш тестовый класс. Затем вы можете выполнить SQL-запрос с помощью 'jdbcTemplate.execue (sql)'. Чтобы запустить этот код перед каждым тестом, вы должны создать метод 'setUp' с аннотацией' @ Before'. Вот пример того, как вводить JdbcTemplate и выполнять запрос: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-flyway/src/test/java /sample/flyway/SampleFlywayApplicationTests.java и вот пример использования '@ Before' http: // junit.sourceforge.net/javadoc/org/junit/Before.html – krynio

ответ

-1

Приведенные выше ответы все используют .sql технику схемы загрузки, где я должен был бы иметь .sql схему для испытаний. Я не хотел делать это так, как моя схема будет расширяться, и я бы предпочел не обсуждать проблемы добавления записей в схему, поскольку мои тесты расширяются.

Как я использую Spring Boot, я наткнулся на эту аннотацию, которая, кажется, решает проблему, сначала запустив bootRun, а затем запустив тесты.

В моих тестовых аннотациях я заменил @ContextConfigurations на @SpringApplicationConfiguration и оставил все классы одинаковыми. Казалось, это решило проблему. Итак, теперь задача test вызывает bootRun для загрузки классов и , тогда запускает тесты.

См @SpringApplicationConfiguration

Hop это помогает любому сталкивается с той же проблемой.

16

Есть различные варианты, если вы не хотите, чтобы выполнить которые явно из @Before JUnit крюк.

  1. Использование Spring Boot's JDBC initialization feature, где вы бы разместить schema.sql или data.sql в src/test/resources папку, так что она будет забрать только во время тестирования.
  2. Использование Spring's @Sql annotation
+0

, но @sql не может поддерживать выполнение только один раз за класс – zhuguowei

Смежные вопросы