首页 > 解决方案 > 使用 JUnit 测试 Spring 应用程序 - 在 testclass 之后保留数据

问题描述

我正在开发一个更大的 Spring Boot 应用程序,它有很多测试(更像是集成测试)。我现在的工作是加快测试过程。我发现,如果我运行多个测试类,我们需要在一次测试运行中设置多次测试应用程序的 testData。我们使用这样的东西来设置类中的数据(编辑:存储库和testDataBuilder@Autowired):

@BeforeEach
public void setup() {
    if (Repository.findByShortId("someId") == null) {
        testDataBuilder.createTestData();
    }
}

在测试类中,这工作正常。但是,如果我的测试运行到下一堂课,它似乎会丢弃数据(数据通常存储在数据库中,我认为在测试中数据存储在内存数据库中,对此不确定。

我尝试了多种方法来完成这项工作,但最终没有任何结果:

这不起作用,因为当时 spring 没有运行,@ClassRule而是运行。

设置 testData 的最佳方法是什么,所以不是每个 testClass 都必须设置它们?

标签: javaspringjunit

解决方案


为什么您的 Test @Configuration 不通过将 H2 内存数据库作为依赖项来映射正确的数据库 bean?

Spring/Springboot 会自动缓存上下文,而无需您做任何特别的事情。

如果您的 @Repository 使用 H2 内存,那么它将在所有测试用例中缓存。

如果您想要它而不是内存, H2可以配置为写入文件(而不是内存)。

By default, closing the last connection to a database closes the database. For an in-memory database, this means the content is lost.

要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

jdbc:h2:~/test;DB_CLOSE_DELAY=-1; <-- 写入文件,并在 VM 处于活动状态时禁用关闭

http://www.h2database.com/html/features.html#database_only_if_exists


推荐阅读