我使用SpringJUnit4ClassRunner
编写集成测试。我还使用@DirtiesContext
进行测试,使上下文处于破碎状态,并且运行正常。
但是现在我有一个测试,它在静态初始化器中设置一个重要的SystemProperty,而后者又在Spring上下文中使用。当测试自行执行时,这也可以正常工作。但是当我使用其他测试运行测试时,Spring上下文已经创建了该属性集并被我的新测试重用。
如何在测试中强制创建Spring上下文,然后使用更改的System Property?
答案 0 :(得分:15)
Pre-Spring 4.2:
遗憾的是,我只能建议一个hack - 你是对的,似乎没有一种简单的方法来初始化新的应用程序上下文而不是使用缓存的应用程序上下文。这些是我建议的一些解决方法:
使用稍微不同的@ContextConfiguration
- 一种快速而又脏的方法可以将@ActiveProfiles
注释添加到测试类中,这样Spring将被强制缓存上下文使用新密钥或使用现有配置定义虚拟上下文作为导入
一个hack,但JUnit 4.11+允许对测试方法排序进行一定程度的控制,可以在目标测试方法之前使用测试方法,并使用@DirtiesContext
注释虚拟测试方法,这样当你的目标方法被调用时,将创建一个新的上下文。
答案 1 :(得分:14)
从Spring 4.2开始,DirtiesContext注释支持以下新阶段:BEFORE_CLASS,BEFORE_EACH_TEST_METHOD和BEFORE_METHOD。所以你现在可以这样做:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
..
}
答案 2 :(得分:1)
有几种选择: