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

时间:2015-04-15 11:03:26

标签: spring integration-testing spring-integration spring-test

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

我有两种不同的测试:

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


   @Test
   public void shouldResolvePropertyForOutPutFile(){

   }
}

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

另一个,其中包含实际测试的更复杂(在下面的代码段中跳过它们):

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

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

当我一个接一个地运行这两个测试时,第二个测试失败了:简而言之,测试的目标是在inMemory DB中插入2行,启动我的Spring Integration流程并使用监听器断言(在jms:listener-container)我在出站端收到了2条JMS消息。我在调试模式中看到实际上 2条消息不会转到同一个监听器,所以我得到一条消息而不是我期望的消息。不知何故,我在第一次测试中加载了一些上下文元素(即使我不对它们做任何事情),这对第二次测试有影响。

我找到了两种不同的解决方法:

  • 在我的第一次测试中添加@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
  • 修改我在第一次测试中加载的Spring文件列表,以便它与第二次测试中定义的文件完全匹配。

但是,我仍然不理解其基本原理,这看起来像是一个错误。

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

有人对此有解释吗?错误与否?

由于

文森特

1 个答案:

答案 0 :(得分:2)

@M。 Deinum的评论是正确的。

对于它的价值,在Spring Integration框架测试中,我们已经开始向所有测试添加@DirtiesContext,以确保在测试完成后始终停止任何活动组件(例如入站消息驱动的适配器)。

对于大型测试套件,这也提高了性能/内存使用率。