Spring Boot:如何在单元测试中使用liquibase设置测试数据

Ren*_*ler 17 java spring liquibase spring-boot

我正在尝试使用liquibase为一些测试设置数据库模式和一些测试数据.每个测试都有一个单独的更改日志,用于设置架构和测试的一些特定数据.

为了使我的测试工作,我需要在每次测试之前删除模式并用新的测试数据填充它.但是,似乎这不起作用,因为一些测试失败,因为旧的测试数据仍然可用.我认为我的配置不正确.如何在每次测试之前强制liquibase删除架构?

我的测试如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyTestConfig.class)
@TestPropertySource(properties = "liquibase.change-log=classpath:changelog/schema-with-testdata.xml")
public class MyRepositoryTest {
Run Code Online (Sandbox Code Playgroud)

测试的配置如下:

@SpringApplicationConfiguration
@Configuration
@EnableAutoConfiguration
@ComponentScan("com.mypackage")
@EntityScan(basePackages = { "com.mypackage.domain" })
@EnableJpaRepositories(basePackages = { "com.mypackage.domain", "com.mypackage.infra.persistence" })
public class MyTestConfig {
Run Code Online (Sandbox Code Playgroud)

而src/main/test/resources下的application.properties是

liquibase.drop-first=true
spring.jpa.hibernate.ddl-auto=none
Run Code Online (Sandbox Code Playgroud)

Mem*_*eak 6

有一个spring.liquibase.dropFirst配置属性。也许这就是你要找的?


Ren*_*ler 1

七年后我可能会更聪明地回答我自己的问题。Spring 在测试之间使用测试上下文缓存。也就是说,如果 spring 上下文在测试之间保持相同,则从缓存中恢复上下文。这是为了加快测试速度。如果您更改数据,Spring 不会注意到并从缓存中恢复上下文,即使需求已更改。有几种方法可以解决这个问题:

  • 使用@DirtiesContext
  • 在测试中使用@Transactional
  • 在@BeforeEach中“手动”删除和设置所有数据