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

px0*_*x06 16 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
Run Code Online (Sandbox Code Playgroud)

我的数据库/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
    })
Run Code Online (Sandbox Code Playgroud)

lub*_*nac 29

如果您不想从@BeforeJUnit钩子显式执行该选项,则有各种选项.

  1. 使用Spring Boot的JDBC初始化功能,您可以在其中放置schema.sqldata.sql放入src/test/resources文件夹,以便仅在测试期间拾取它.
  2. 使用Spring的@Sql注释

  • 但是@sql不能支持每个类仅执行一次 (2认同)

MxW*_*ild 7

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

@Sql(scripts = "classpath:db/populateDB.sql")
Run Code Online (Sandbox Code Playgroud)


px0*_*x06 5

上面的答案全部使用.sql模式加载技术,其中我必须具有.sql模式进行测试。我不想那样做,因为我的架构会不断扩展,而我宁愿不要因为测试扩展而烦恼在架构中添加条目。

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

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

参见@SpringApplicationConfiguration

希望这可以帮助面临相同问题的任何人。