当前位置: 首页 > 面试题库 >

如何在Spring的每个测试之前重新创建数据库?

刘玉石
2023-03-14
问题内容

我的Spring-Boot-Mvc-Web应用程序在application.properties文件中具有以下数据库配置:

spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

这是我所做的唯一配置。我在任何地方都没有进行任何其他配置。尽管如此,Spring和子系统会在每次Web应用程序运行时自动重新创建数据库。即在系统运行时重新创建数据库,而在应用程序结束后它包含数据。

我不了解此默认值,并期望它适合测试。

但是,当我开始运行测试时,我发现数据库仅重建一次。由于没有按预定义的顺序执行测试,因此这根本没有意义。

所以,问题是:如何变得有意义?即在应用程序首次启动时如何使数据库在每次测试之前重新创建?

我的测试类标题如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = myapp.class)
//@WebAppConfiguration
@WebIntegrationTest
@DirtiesContext
public class WebControllersTest {

如你所见,我@DirtiesContext在课堂上尝试过,但没有帮助。

更新

I have a bean

@Service
public class DatabaseService implements InitializingBean {

有一个方法

@Override
    @Transactional()
    public void afterPropertiesSet() throws Exception {
        log.info("Bootstrapping data...");
        User user = createRootUser();
        if(populateDemo) {
            populateDemos();
        }
        log.info("...Bootstrapping completed");
    }

现在,我使用它populateDemos()来清除数据库中的所有数据。遗憾的是,尽管,它没有在每次测试前调用@DirtiesContext。为什么?


问题答案:

实际上,我认为你想要这样做:

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

@DirtiesContext可以用作同一类中的类级和方法级批注。在这种情况下,ApplicationContext将在任何此类带注释的方法之后以及在整个类之后标记为dirty。如果DirtiesContext.ClassMode设置为AFTER_EACH_TEST_方法,则在类中的每个测试方法之后都会将上下文标记为dirty。



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

  • 如何让Spring Boot在测试类之间从头开始重新创建内存中的测试数据库? 我有几个用和注释的本地集成测试,可以改变数据库状态。我已经用标记了每一个。我期望创建内存数据库的代码将是应用上下文生命周期的一部分,因此在任何后续测试中都应该创建一个新的生命周期。 我可以在日志中看到Flyway正在尝试重新应用迁移,并认为它们已经完成,因为数据库尚未清除。 Spring Boot是否在每个应用上下文之外

  • 我尝试在片段子类中使用onSaveInstanceState(Bundle outState)方法保存数据。 解释:我创建了一个类FragmentA,它扩展了这个类中的Fragment。我有一个变量名count,当我单击按钮时,count的值发生了变化(最初count=0)。我想保存count的值,即使方向发生了变化(纵向到横向,反之亦然)。我的MainActivity类动态加载片段。 我的代码:

  • 我们正在编写一个Spring Boot应用程序并使用云合约WireMock支持来存根支持服务。我们的测试类注释如下: 这工作正常,除了一件事:我们发现Spring Cloud似乎没有在测试之间重置WireMock,特别是删除存根,因此测试没有正确隔离。当然,您可以使用包含的方法自己完成此操作,但我们想知道这是否是故意的。是否有我们忽略的选项或必须使用的附加注释? 毕竟,在一个方法中定义存根是不可能

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

  • 我试图第一次针对预先存在的数据库自动生成alembic修订版,但当我运行以下命令时 它生成一个迁移,尝试创建我数据库中的每个表和索引。类似于此: 然后,如果我尝试运行迁移,它会失败,因为对象已经存在: 所以在我看来,alembic认为我的数据库不包含任何表,但它确实包含。 知道为什么会这样吗?