我使用SpringJUnit4ClassRunner
来编写集成测试。我还@DirtiesContext
用于将上下文置于损坏状态的测试,并且效果很好。
但是现在我在静态初始化程序中测试了一个重要的 SystemProperty,它又在 Spring 上下文中使用。当测试自行执行时,这又可以正常工作。但是当我使用其他测试运行测试时,Spring 上下文已经在没有该属性集的情况下创建,并被我的新测试重用。
如何在我的测试中强制重新创建 Spring 上下文,然后它将使用更改后的系统属性?
从 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 {
..
}
春季前 4.2:
不幸的是,我只能建议一个 hack - 你是对的,似乎没有一种简单的方法来初始化新的应用程序上下文而不是使用缓存的应用程序上下文。这些是我可以建议的一些解决方法:
使用稍微不同@ContextConfiguration
的方法——一种快速而肮脏的方法可能是向@ActiveProfiles
测试类添加注释,这样 Spring 将被迫使用新键缓存上下文或使用现有配置定义虚拟上下文作为导入
一个 hack,但 JUnit 4.11+ 允许对测试方法排序进行一定程度的控制,可以在目标测试方法之前有一个测试方法,并且可以在@DirtiesContext
目标方法被称为新方法时使用 d 注释虚拟测试方法将创建上下文。
有几种选择: