当前位置: 首页 > 知识库问答 >
问题:

使Spring Boot重新创建测试数据库

贝杜吟
2023-03-14

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

我有几个用@SpringApplication ationConfiguration@WebIntationTest注释的本地集成测试,可以改变数据库状态。我已经用@DirtiesContext标记了每一个。我期望创建内存数据库的代码将是应用上下文生命周期的一部分,因此在任何后续测试中都应该创建一个新的生命周期。

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

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

编辑

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

共有2个答案

长孙兴德
2023-03-14

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

@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有一部红色的大手机吗?),如果你认为这是一个bug,我可以启动一个测试项目来展示它的行为。

廖弘伟
2023-03-14

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

Spring Boot是否在每个应用上下文之外创建内存数据库并在它们之间共享?

那不太可能。更有可能的是,数据库只在加载第一个Application ationContext时创建一次,并且在同一JVM中执行的所有测试中使用一个数据库。这可以解释你所说的“数据库没有被清除”的事实。

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

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

请让我知道,如果你的作品。

当做

Sam(SpringTestContext框架的作者)

 类似资料:
  • 假设我有一个测试来断言系统中新用户的注册是否真的成功: 现在,这将在实际数据库中创建一个新的测试用户,因为我希望这个测试在实际环境中运行。这意味着测试不能一直运行,对吗?我应该如何进行此类测试?那些使用系统的实际环境并操纵真实数据的人?

  • 问题内容: 我的Spring-Boot-Mvc-Web应用程序在文件中具有以下数据库配置: 这是我所做的唯一配置。我在任何地方都没有进行任何其他配置。尽管如此,Spring和子系统会在每次Web应用程序运行时自动重新创建数据库。即在系统运行时重新创建数据库,而在应用程序结束后它包含数据。 我不了解此默认值,并期望它适合测试。 但是,当我开始运行测试时,我发现数据库仅重建一次。由于没有按预定义的顺序

  • 问题内容: 我的Spring-Boot-Mvc-Web应用程序在文件中具有以下数据库配置: 这是我所做的唯一配置。我在任何地方都没有进行任何其他配置。尽管如此,Spring和子系统会在每次Web应用程序运行时自动重新创建数据库。即在系统运行时重新创建数据库,而在应用程序结束后它包含数据。 我不了解此默认值,并期望它适合测试。 但是,当我开始运行测试时,我发现数据库仅重建一次。由于没有按预定义的顺序

  • 问题内容: 我有一个Spring / Hibernate网络应用程序,该应用程序具有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用了这个空白数据库并创建了我的所有测试表和约束。但是,我有一个新的bean,在它的afterPropertiesSet()方法期间检查数据库中的特定配置值,因此,当初始化此bean时,数据库中必须存在这样的行。

  • 当应用程序启动时,我正在尝试创建mysql数据库。我尝试了波纹管配置,但无法实现,如果有人对此有想法,请告诉我,

  • 我在测试方面有问题。这是我第一次写测试,我遇到了一个问题。 我刚刚在我的应用程序中创建了一个测试文件夹,并且用于测试URL。 当我键入: 它说: 创建别名默认的测试数据库...创建测试数据库时出错:数据库"database_name"已经存在 如果要尝试删除测试数据库“database_name”,请键入“yes”,或键入“no”取消: 这是什么意思?如果我输入yes会发生什么?我是否丢失了数据库