在每次测试前触发 Flyway 迁移

Triggering Flyway migration before each test

我正在 Spring 引导项目中实施集成测试套件。我的项目正在使用Flyway进行数据库迁移。

我的测试 class 看起来与此类似:

@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 字段 class:

@Autowired
private lateinit var flyway: Flyway

@BeforeEach
fun setup() {
    flyway.migrate()
}

但是有 No qualifying bean of type 'org.flywaydb.core.Flyway' available.

那么,在每次测试之前触发迁移的正确方法是什么?

注释:

找到了一个考虑 JUnit 和 Spring 启动配置的解决方案。

No qualifying bean of type 'org.flywaydb.core.Flyway' available 的原因是我配置错误:spring.flyway.enabled=false。这也禁用了 Flyway 实例的创建,而不仅仅是初始迁移。

所以我从 application.properties 中删除了此 属性,并将此代码添加到我的测试 class(同样由 Onome Sotu 建议在他的评论中):

@Autowired
private lateinit var flyway: Flyway

@BeforeEach
fun setup() {
    flyway.clean()
    flyway.migrate()
}

我还在测试中添加了@TestInstance(TestInstance.Lifecycle.PER_CLASS) class:这样容器只创建并启动一次(不需要从头开始重新创建数据库,因为我可以在每次测试前清理它).此外,这使得测试执行速度非常快。

注意:实际上,使用此设置,容器创建会执行两次:一次在上下文启动时,一次在测试 class 创建时。类似地,数据库迁移针对每个测试用例执行 +1(+1 发生在上下文启动时)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...

尝试像这样注释您的测试:

@Test
@FlywayTest
public void testFunction(){..}

来自 Flyway 文档:

Annotation FlywayTest for database unit testing. Use Flyway feature.

clean - execution of flyway task clean
init - execution of flyway task init
migrate - execution of flyway task migrate

https://github.com/flyway/flyway-test-extensions

此外,请确保包含以下依赖项:

testCompile 'org.flywaydb:flyway-core:6.4.1'

testCompile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:6.3.3'