java - 使用 JUnit 测试 Spring 应用程序 - 在 testclass 之后保留数据
问题描述
我正在开发一个更大的 Spring Boot 应用程序,它有很多测试(更像是集成测试)。我现在的工作是加快测试过程。我发现,如果我运行多个测试类,我们需要在一次测试运行中设置多次测试应用程序的 testData。我们使用这样的东西来设置类中的数据(编辑:存储库和testDataBuilder
是@Autowired
):
@BeforeEach
public void setup() {
if (Repository.findByShortId("someId") == null) {
testDataBuilder.createTestData();
}
}
在测试类中,这工作正常。但是,如果我的测试运行到下一堂课,它似乎会丢弃数据(数据通常存储在数据库中,我认为在测试中数据存储在内存数据库中,对此不确定。
我尝试了多种方法来完成这项工作,但最终没有任何结果:
在每个测试都扩展的抽象类中构建数据
与@commit 一起进行一些测试
使用 testSuite 并尝试在所有测试之前创建数据,如下所示:
@RunWith(Suite.class) @SuiteClasses({testClass1.class ...}) @SpringBootTest @ActiveProfiles({ "unit-test" }) public class testSuite { @ClassRule public static setupTestData setup = new setupTestData(); }
这不起作用,因为当时 spring 没有运行,@ClassRule
而是运行。
设置 testData 的最佳方法是什么,所以不是每个 testClass 都必须设置它们?
解决方案
为什么您的 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
推荐阅读
- python - 如何循环返回网页抓取结果并保存到 Excel 文件?
- asp.net-core - 使用 AutoMapper 进行多对多关系展平
- c# - C# Telegram.Bot SendTextMessageAsync 不发送任何消息
- c# - 如何在 C++ 非托管代码中反序列化 byte[] 的 json 字符串为 Json?
- c++ - std::condition_variable 对系统时钟敏感
- firefox - 我可以停止显示 Firefox webRTC 共享指示器吗?
- laravel - laravel 路由问题?
- python - 在 Brython 中使用 cookie
- c# - C# - 方法中的辅助方法?
- electron - 带有电子的持久触摸条