我正在开发一个我们集中使用集成测试的应用程序,因为我们使用的核心框架在数据库上运行。
我有使用配置上下文类的测试类,例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConfigA.class)
public A_Test(){
}
大多数测试使用与上述相同的上下文。我们有200多个这样的测试。但是最近我们还需要对一些用例进行一些额外的配置,例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ConfigA.class, ConfigB.class})
public B_Test(){
}
现在问题是当我们使用maven或IDE运行程序执行所有测试时,ConfigA的加载缓存不再有效。 Spring尝试重新创建ConfigA的上下文失败,因为我们已经配置了H2 DB,而Spring尝试创建模式,表格没有这样做。
为了克服我们开始在所有测试中使用@DirtiesContext。结果超过了1H构建时间,这显着降低了开发人员的工作效率。
问题:是否可以仅清除B_Test
等测试的上下文? @DirtiesContext(ClassMode = AFTER_CLASS)没有帮助,因为测试顺序无法保证(实际上我们不想这样做)。当B_Test测试的类型最后运行时,它会失败。 @DirtiesContext(ClassMode = BEFORE_CLASS)也是如此,反之亦然
是否可以在一堆测试中同时模拟@DirtiesContext(ClassMode = AFTER_CLASS)和@DirtiesContext(ClassMode = BEFORE_CLASS)?
或者有没有其他方法可以解决这个问题?
到目前为止我们尝试了什么:
答案 0 :(得分:2)
如何同时使用@DirtiesContext(ClassMode = AFTER_CLASS)和@DirtiesContext(MethodMode = BEFORE_METHOD)?
当你这样做时,Spring会在调用@DirtiesContext注释的测试方法(MethodMode = BEFORE_METHOD)之前重新加载上下文ConfigA.class和ConfigB.class。 然后,在B_Test的所有测试完成后,Spring关闭了上下文(下一个使用SpringJUnit4ClassRunner的测试类将加载其上下文)。
答案 1 :(得分:0)
这基本上是Make Spring Boot Recreate Test Databases的副本。
总之,您可能只需要确保为使用ConfigA
类创建的每个嵌入式数据库使用唯一名称。
请详细阅读我的评论:https://stackoverflow.com/a/28867247/388980
另外,请参阅SPR-8849中的评论以获取更多详细信息。
此致
Sam( Spring TestContext Framework的作者)