制作 Spring 引导重新创建测试数据库
Make Spring Boot Recreate Test Databases
我怎样才能 Spring 在测试 类 之间从头开始重新创建内存中测试数据库?
我有几个本地集成测试用 @SpringApplicationConfiguration
和 @WebIntegrationTest
注释来改变数据库状态。我用 @DirtiesContext
标记了每一个。我原以为创建内存数据库的代码将成为 ApplicationContext
生命周期的一部分,因此在任何后续测试中都应该创建一个新的。
我可以在日志中看到 Flyway 正在尝试重新应用迁移并认为它们已经完成,因为数据库尚未被清除。
是否 Spring 引导在每个 ApplicationContext
外部创建内存数据库并在它们之间共享?有什么办法可以控制这种行为吗?
编辑
当 运行 从 Maven 而不是 Eclipse 进行测试时,我也看到了奇怪的行为。我的一个数据库表在 Maven 中更改状态,但在 Eclipse 中没有。这可能是 ClassLoader 问题吗?
指定自定义配置会产生预期的行为。
@Configuration
@EnableAutoConfiguration(exclude={
SecurityAutoConfiguration.class,
ManagementSecurityAutoConfiguration.class,
DataSourceAutoConfiguration.class
})
@EnableJpaRepositories(basePackages = "com.example.repository")
public class TestConfig {
@Bean
public String sharedSecret() {
return null;
}
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.build();
}
}
如果 Pivotal 的任何人读到这篇文章(Dave Syer 有大红色 phone 吗?),如果您认为这是一个错误,我可以敲一个测试项目来展示行为。
由于无法检查您项目的配置和 运行 时间行为,我只能假设您 运行 遇到了 SPR-8849 中描述的相同问题。
Is Spring Boot creating the in-memory database outside of each ApplicationContext
and sharing it between them?
这不太可能。更有可能的是,数据库仅在加载第一个 ApplicationContext
时创建一次,并且在同一 JVM 中执行的所有测试中都使用一个数据库。这将解释 "the database hasn't been purged," 正如您所说的事实。
Is there any way to control this behaviour?
如果我的上述假设是正确的,是的:您可以通过确保为每个嵌入式数据库使用唯一的数据库名称来控制这一点。详情见SPR-8849中的评论。
请告诉我这是否适合你。
此致,
Sam(Spring TestContext Framework 的作者)
我怎样才能 Spring 在测试 类 之间从头开始重新创建内存中测试数据库?
我有几个本地集成测试用 @SpringApplicationConfiguration
和 @WebIntegrationTest
注释来改变数据库状态。我用 @DirtiesContext
标记了每一个。我原以为创建内存数据库的代码将成为 ApplicationContext
生命周期的一部分,因此在任何后续测试中都应该创建一个新的。
我可以在日志中看到 Flyway 正在尝试重新应用迁移并认为它们已经完成,因为数据库尚未被清除。
是否 Spring 引导在每个 ApplicationContext
外部创建内存数据库并在它们之间共享?有什么办法可以控制这种行为吗?
编辑
当 运行 从 Maven 而不是 Eclipse 进行测试时,我也看到了奇怪的行为。我的一个数据库表在 Maven 中更改状态,但在 Eclipse 中没有。这可能是 ClassLoader 问题吗?
指定自定义配置会产生预期的行为。
@Configuration
@EnableAutoConfiguration(exclude={
SecurityAutoConfiguration.class,
ManagementSecurityAutoConfiguration.class,
DataSourceAutoConfiguration.class
})
@EnableJpaRepositories(basePackages = "com.example.repository")
public class TestConfig {
@Bean
public String sharedSecret() {
return null;
}
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.build();
}
}
如果 Pivotal 的任何人读到这篇文章(Dave Syer 有大红色 phone 吗?),如果您认为这是一个错误,我可以敲一个测试项目来展示行为。
由于无法检查您项目的配置和 运行 时间行为,我只能假设您 运行 遇到了 SPR-8849 中描述的相同问题。
Is Spring Boot creating the in-memory database outside of each
ApplicationContext
and sharing it between them?
这不太可能。更有可能的是,数据库仅在加载第一个 ApplicationContext
时创建一次,并且在同一 JVM 中执行的所有测试中都使用一个数据库。这将解释 "the database hasn't been purged," 正如您所说的事实。
Is there any way to control this behaviour?
如果我的上述假设是正确的,是的:您可以通过确保为每个嵌入式数据库使用唯一的数据库名称来控制这一点。详情见SPR-8849中的评论。
请告诉我这是否适合你。
此致,
Sam(Spring TestContext Framework 的作者)