我正在为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 Test 4.1.4.RELEASE。我已将必要的最少代码放在单独的项目中以便能够重现。如果需要,我可以分享。
有人对此有解释吗?错误与否?
由于
文森特
答案 0 :(得分:2)
@M。 Deinum的评论是正确的。
对于它的价值,在Spring Integration框架测试中,我们已经开始向所有测试添加@DirtiesContext
,以确保在测试完成后始终停止任何活动组件(例如入站消息驱动的适配器)。
对于大型测试套件,这也提高了性能/内存使用率。