Spring 测试:测试 类 之间上下文配置缓存的奇怪行为?

Spring test : strange behavior of context config caching between test classes ?

我正在为一个 Spring 集成项目编写测试,我正在 运行 遇到一些奇怪的事情:我已经阅读了有关 Spring 如何缓存测试之间的上下文以及如何我们可以使用@DirtiesContext 注释强制清理缓存。但是,我无法解释我观察到的行为,这让我觉得这可能是一个错误...

我有 2 个不同的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:myInterface-core.xml",
                                    "classpath:myInterface-datasource-test.xml"})
public class PropertyConfigurerTest {


   @Test
   public void shouldResolvePropertyForOutPutFile(){

   }
}

(它什么都不做,只是故意加载上下文)

还有一个更复杂,里面有实际测试(在下面的代码片段中跳过它们):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
 "classpath:myInterface-core.xml",
 "classpath:myInterface-rmi.xml",
 "classpath:myInterface-datasource-test.xml"})
public class MontranMessagesFlowTest {
...
}

如您所见,这两个测试不会加载完全相同的配置:第二个测试加载一个额外的配置文件,而第一个测试不需要。

当我 运行 这 2 个测试一个接一个地进行时,第二个测试失败了:简而言之,测试的目标是在内存数据库中插入 2 行,开始我的 Spring集成流程并通过侦听器(在 jms:listener-容器内)断言我在出站端收到了 2 条 JMS 消息。我在调试模式下看到实际上 2 条消息不会发送到同一个侦听器 ,所以我收到一条消息而不是我期望的 2 条消息。不知何故,我在第一次测试中加载了一些上下文元素(即使我没有对它们做任何事情)对第二次测试有影响。

我发现了 2 种不同的解决方法:

但是,我仍然不明白其中的原理,对我来说它看起来像是一个错误。

我正在使用 Spring 测试 4.1.4.RELEASE。我已经将必要的最少代码放在一个单独的项目中以便能够重现。如果需要,我可以分享。

有人对此有解释吗?有没有错误?

谢谢

文森特

@M。 Deinum 在他的评论中是正确的。

值得一提的是,在 Spring 集成框架测试本身中,我们已开始将 @DirtiesContext 添加到所有测试中,以确保任何活动组件(例如入站消息驱动的适配器)始终处于测试完成后停止。

这对大型测试套件也有 performance/memory 使用改进。