在Spring Boot测试之前初始化数据库

时间:2016-07-08 08:43:38

标签: java mysql spring hibernate spring-boot

我正在使用JUnit来测试我的应用程序,只要数据库在测试之前已经初始化(使用gradle bootRun作为web-app运行),一切正常。但是,如果数据库为空,则应用程序似乎在测试之前不会初始化任何模型或实体。有没有办法我应该这样做?我假设ApplicationRunner类将在测试之前运行并使实体初始化。有没有办法做到这一点,还是我使用了错误的方法?

这就是我的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以便在启动时向数据库添加几行。

编辑:

我还应该补充一点,这些是我在JUnit测试文件中使用的注释:

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

3 个答案:

答案 0 :(得分:25)

如果您不想从@Before JUnit钩子显式执行该选项,可以使用各种选项。

  1. 使用Spring Boot's JDBC initialization feature,您可以将schema.sqldata.sql放入src/test/resources文件夹,以便仅在测试期间将其选中。
  2. 使用Spring's @Sql annotation

答案 1 :(得分:2)

以上答案都使用.sql架构加载技术,我必须有一个.sql架构进行测试。我不希望这样做,因为我的架构正在扩展,而且当我的测试扩展时,我宁愿不经历向架构添加条目的麻烦。

当我使用Spring Boot时,我遇到了这个注释,它似乎通过首先运行bootRun然后运行测试来解决问题。

在我的测试注释中,我将@ContextConfigurations替换为@SpringApplicationConfiguration,并将所有类保持为相同。这似乎解决了这个问题。所以现在test任务调用bootRun加载类,然后运行测试。

请参阅@SpringApplicationConfiguration

跳跃这可以帮助任何人面对同样的问题。

答案 2 :(得分:1)

例如,您可以使用@Sql注释来填充数据库^

@Sql(scripts = "classpath:db/populateDB.sql")