如何解决每次测试前触发Flyway迁移
我正在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在上下文启动时发生)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。