我正在开发一个更大的spring启动应用程序,它有很多测试(更像是集成测试)。我现在的工作是加快考试的进程。我发现,如果我运行多个测试类,那么testdata,我们需要在一个testrun中多次设置测试应用程序。我们使用这样的方法来设置类中的数据(编辑:存储库和 testDataBuilder
是 @Autowired
):
@BeforeEach
public void setup() {
if (Repository.findByShortId("someId") == null) {
testDataBuilder.createTestData();
}
}
在testclass中,这可以正常工作。但是如果我的测试运行到下一个类,它似乎会删除数据(数据通常存储在数据库中,我认为在测试中数据存储在内存数据库中,对此不确定)。
我尝试了多种方法来实现这一点,但最终没有成功:
在每个测试扩展的抽象类中构建数据
在某些测试中使用@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都必须设置它们?
1条答案
按热度按时间5gfr0r5j1#
为什么test@configuration不将h2 inmemory数据库作为依赖项来Map正确的数据库bean?
spring/springboot自动缓存上下文,而不需要做任何特殊的操作。
如果@repository使用h2内存,那么它将在所有测试用例中缓存。
h2也可以配置为写入一个文件(而不是内存),如果您想要它而不是内存的话。
要保持数据库打开,请添加;db\u close\u delay=-1到数据库url。要在虚拟机处于活动状态时保留内存中数据库的内容,请使用jdbc:h2:mem:test;db\u close\u delay=-1。
jdbc:h2:~/试验;db\u close\u delay=-1;<--写入文件,并在vm处于活动状态时禁用关闭
http://www.h2database.com/html/features.html#database_only_if_exists