【问题标题】:Make Spring Boot Recreate Test Databases使 Spring Boot 重新创建测试数据库
【发布时间】:2015-04-26 00:02:21
【问题描述】:

如何让 Spring Boot 在测试类之间从头开始重新创建内存测试数据库?

我有几个用 @SpringApplicationConfiguration@WebIntegrationTest 注释的本地集成测试,它们会改变数据库状态。我已经用@DirtiesContext 标记了每一个。我期待创建内存数据库的代码将成为ApplicationContext 生命周期的一部分,因此应该在任何后续测试中创建一个新的。

我可以在日志中看到 Flyway 正在尝试重新应用迁移,并认为它们已经完成,因为尚未清除数据库。

Spring Boot 是否在每个 ApplicationContext 之外创建内存数据库并在它们之间共享?有没有办法控制这种行为?

编辑

从 Maven 而不是 Eclipse 运行测试时,我也看到了奇怪的行为。我的一个数据库表正在 Maven 中更改状态,但在 Eclipse 中没有。这可能是 ClassLoader 问题吗?

【问题讨论】:

  • 您希望在测试开始时完全重新创建数据库还是简单地恢复到初始状态?如果是后者,你不能使用@Rollback 来回滚更改吗?
  • 感谢您的评论。我希望完全放弃它们,以便在测试之间实现最大程度的隔离。
  • 对于像在测试之间重新创建数据库这样的事情,我过去使用过 dbunit。还有一个spring-dbunit integration

标签: java spring spring-mvc spring-boot spring-test


【解决方案1】:

指定自定义配置会产生预期的行为。

@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 是否有一个红色的大手机?),如果您认为这是一个错误,我可以敲出一个测试项目来展示该行为。

【讨论】:

  • 作为 Spring TestContext Framework 的作者,如果您能创建一个测试项目来展示这种行为,我将不胜感激。如果你这样做了,请告诉我(GitHub 和 Spring 的 JIRA 上的“sbrannen”),我会看一看。
【解决方案2】:

由于无法检查项目的配置和运行时行为,我只能假设您遇到了SPR-8849 中描述的相同问题。

Spring Boot 是否在每个 ApplicationContext 之外创建内存数据库并在它们之间共享?

这不太可能。更有可能的是,在加载第一个 ApplicationContext 时,仅创建一次数据库,并且在同一 JVM 中执行的所有测试中都使用一个数据库。这可以解释您所说的“数据库尚未被清除”这一事实。

有没有办法控制这种行为?

如果我的上述假设是正确的,那么是的:您可以通过确保为每个嵌入式数据库使用唯一的数据库名称来控制这一点。详情见SPR-8849中的cmets。

如果这对你有用,请告诉我。

问候,

Sam(Spring TestContext 框架的作者

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2020-12-25
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2013-11-05
    • 2020-07-10
    相关资源
    最近更新 更多