如何在测试执行之前强制使用新版本的Spring上下文

Jen*_*der 18 spring junit4

我用它SpringJUnit4ClassRunner来编写集成测试.我也@DirtiesContext用于测试,使背景处于破碎状态,并且工作得很好.

但是现在我有一个测试,它在静态初始化器中设置一个重要的SystemProperty,而后者又在Spring上下文中使用.当测试自行执行时,这也可以正常工作.但是当我使用其他测试运行测试时,Spring上下文已经创建了该属性集并被我的新测试重用.

如何在我的测试中强制重新创建Spring上下文,然后将使用更改的System Property?

Bij*_*men 16

Pre-Spring 4.2:

不幸的是,我只能建议一个黑客 - 你是对的,似乎没有一种简单的方法来初始化新的应用程序上下文而不是使用缓存的应用程序上下文.这些是我建议的一些解决方法:

  1. 使用略有不同@ContextConfiguration- 快速而肮脏的方法可以是向@ActiveProfiles测试类添加注释,这样Spring将被强制使用新键缓存上下文或使用现有配置定义虚拟上下文作为导入

  2. 一个hack,但是JUnit 4.11+允许对测试方法排序进行一定程度的控制,可以在目标测试方法之前有一个测试方法并且使用虚拟测试方法注释@DirtiesContext,这样当你的目标方法被称为新鲜时将创建上下文.


Joh*_*han 16

从Spring 4.2开始,DirtiesContext注释支持以下新阶段:BEFORE_CLASS,BEFORE_EACH_TEST_METHODBEFORE_METHOD.所以你现在可以这样做:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
   ..
}
Run Code Online (Sandbox Code Playgroud)