问题描述
我正在Spring Boot项目中实现集成测试套件。我的项目正在使用Flyway进行数据库迁移。
我的测试课看起来像这样:
@SpringBoottest
@AutoConfiguremockmvc
@Testcontainers
internal class MyIntegrationTest {
@Container
private val postgres = postgresContainer
@Autowired
private lateinit var mockmvc: mockmvc
// ... several test cases
}
Spring Boot在应用程序上下文启动时运行Flyway迁移。问题在于@SpringBoottest
仅启动一次应用程序上下文,因此我的数据库仅在所有测试之前初始化,而不在每个测试之前初始化。
我还尝试在测试课程中注入Flyway字段:
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.migrate()
}
但是有No qualifying bean of type 'org.flywaydb.core.Flyway' available
。
那么,在每次测试之前触发迁移的正确方法是什么?
注释:
- 已为每个测试正确创建并启动了(Postgresql)测试容器。
- 我在application.properties中使用此配置:
spring.flyway.enabled=false
解决方法
通过JUnit和Spring Boot配置找到了一个解决方案思考者。
使用No qualifying bean of type 'org.flywaydb.core.Flyway' available
的原因是我的配置错误:spring.flyway.enabled=false
。这不仅禁用了Flyway实例的创建,而且还禁用了初始迁移。
因此,我从application.properties
中删除了此属性,并将此代码添加到了我的测试类中(也由 Onome Sotu 在他的评论中建议):
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.clean()
flyway.migrate()
}
我还向测试类中添加了@TestInstance(TestInstance.Lifecycle.PER_CLASS)
:这样,容器就可以创建和启动一次(无需重新创建数据库,因为我可以在每次测试前清理它,因此无需重新创建数据库)。此外,这使测试执行非常快。
注意:实际上,使用此设置,容器创建执行两次:一次在上下文启动时创建,一次在测试类创建时执行。同样,对每个测试用例+1执行数据库迁移(该+1在上下文启动时发生)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...