每次测试前触发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在上下文启动时发生)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...