Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 每次测试前触发Flyway迁移_Spring_Spring Boot_Kotlin_Database Migration_Flyway - Fatal编程技术网

Spring 每次测试前触发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

我正在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
只启动应用程序上下文一次,因此我的数据库在所有测试之前只初始化,而不是在每个测试之前初始化

我还试着在我的测试课上注入一个飞行场:

@Autowired
private lateinit var flyway: Flyway

@BeforeEach
fun setup() {
    flyway.migrate()
}
但是,
没有“org.flywaydb.core.Flyway”类型的合格bean可用

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

注释

  • (PostgreSQL)为每个测试正确创建和启动测试容器
  • 我正在application.properties:
    spring.flyway.enabled=false中使用此配置

找到了一个解决方案,它考虑了JUnit和Spring引导配置

没有“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使用了错误的配置。。。