冲突配置上下文的{spring}集成测试清理

时间:2016-11-05 16:13:01

标签: java spring junit spring-test

我正在开发一个我们集中使用集成测试的应用程序,因为我们使用的核心框架在数据库上运行。

我有使用配置上下文类的测试类,例如:

@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)?

或者有没有其他方法可以解决这个问题?

到目前为止我们尝试了什么:

  1. Junit Suites:对春天环境没什么帮助
  2. ContextHierarchies:没有帮助B_Type测试也污染上下文的情况
  3. 测试排序:没有人真的很高兴重构所有测试以使其神奇地工作

2 个答案:

答案 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的作者