Spring 每次测试前触发Flyway迁移
我正在Spring Boot项目中实现一个集成测试套件。我的项目使用Flyway进行数据库迁移 我的测试类与此类似:Spring 每次测试前触发Flyway迁移,spring,spring-boot,kotlin,database-migration,flyway,Spring,Spring Boot,Kotlin,Database Migration,Flyway,我正在Spring Boot项目中实现一个集成测试套件。我的项目使用Flyway进行数据库迁移 我的测试类与此类似: @SpringBootTest @AutoConfigureMockMvc @Testcontainers internal class MyIntegrationTest { @Container private val postgres = postgresContainer @Autowired private lateinit var m
@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers
internal class MyIntegrationTest {
@Container
private val postgres = postgresContainer
@Autowired
private lateinit var mockMvc: MockMvc
// ... several test cases
}
Spring Boot在应用程序上下文启动时运行Flyway迁移。问题是@SpringBootTest
只启动应用程序上下文一次,因此我的数据库在所有测试之前只初始化,而不是在每个测试之前初始化
我还试着在我的测试课上注入一个飞行场:
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.migrate()
}
但是,没有“org.flywaydb.core.Flyway”类型的合格bean可用
那么,在每次测试之前触发迁移的正确方法是什么
注释:
- (PostgreSQL)为每个测试正确创建和启动测试容器
- 我正在application.properties:
spring.flyway.enabled=false中使用此配置
没有“org.flywaydb.core.Flyway”类型的合格bean可用的原因是我的配置错误:spring.Flyway.enabled=false
。这也将禁用Flyway实例的创建,而不仅仅是初始迁移
因此,我从application.properties
中删除了该属性,并将该代码添加到我的测试类中(Onome Sotu在他的评论中也建议了这一点):
我还将@TestInstance(TestInstance.Lifecycle.PER_CLASS)
添加到测试类中:通过这种方式,只需创建和启动一次容器(无需从头创建数据库,因为我可以在每次测试之前清理它)。此外,这使得测试执行速度非常快
注意:实际上,在这个设置中,容器创建会执行两次:一次在上下文启动时执行,一次在测试类创建时执行。类似地,对每个测试用例+1执行DB迁移(在上下文启动时执行+1)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)…。找到了一种解决方案,它考虑了JUnit和Spring引导配置
没有“org.flywaydb.core.Flyway”类型的合格bean可用的原因是我的配置错误:spring.Flyway.enabled=false
。这也将禁用Flyway实例的创建,而不仅仅是初始迁移
因此,我从application.properties
中删除了该属性,并将该代码添加到我的测试类中(Onome Sotu在他的评论中也建议了这一点):
我还将@TestInstance(TestInstance.Lifecycle.PER_CLASS)
添加到测试类中:通过这种方式,只需创建和启动一次容器(无需从头创建数据库,因为我可以在每次测试之前清理它)。此外,这使得测试执行速度非常快
注意:实际上,在这个设置中,容器创建会执行两次:一次在上下文启动时执行,一次在测试类创建时执行。类似地,对每个测试用例+1执行DB迁移(在上下文启动时执行+1)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)…。尝试如下注释您的测试:
@Test
@FlywayTest
public void testFunction(){..}
从Flyway文档:
用于数据库单元测试的注释FlywayTest。使用Flyway功能
clean - execution of flyway task clean
init - execution of flyway task init
migrate - execution of flyway task migrate
此外,请确保包含以下依赖项:
testCompile 'org.flywaydb:flyway-core:6.4.1'
testCompile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:6.3.3'
尝试按如下方式注释您的测试:
@Test
@FlywayTest
public void testFunction(){..}
从Flyway文档:
用于数据库单元测试的注释FlywayTest。使用Flyway功能
clean - execution of flyway task clean
init - execution of flyway task init
migrate - execution of flyway task migrate
此外,请确保包含以下依赖项:
testCompile 'org.flywaydb:flyway-core:6.4.1'
testCompile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:6.3.3'
看看注入flyway字段并运行flyway.clean()、flyway.migrate()应该可以工作。你检查过为什么找不到合格的豆子吗?@Onomosotu,是的,你说得对。我对Flyway使用了错误的配置…请查看注入Flyway字段并运行Flyway.clean()、Flyway.migrate()应该可以工作。你检查过为什么找不到合格的豆子吗?@Onomosotu,是的,你说得对。我对Flyway使用了错误的配置。。。