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

时间:2013-01-11 10:27:14

标签: spring junit4

我使用SpringJUnit4ClassRunner编写集成测试。我还使用@DirtiesContext进行测试,使上下文处于破碎状态,并且运行正常。

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

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

3 个答案:

答案 0 :(得分:15)

Pre-Spring 4.2:

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

  1. 使用稍微不同的@ContextConfiguration - 一种快速而又脏的方法可以将@ActiveProfiles注释添加到测试类中,这样Spring将被强制缓存上下文使用新密钥或使用现有配置定义虚拟上下文作为导入

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

答案 1 :(得分:14)

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
   ..
}

答案 2 :(得分:1)

有几种选择:

  1. 您可以通过在其中加载其他配置来为此测试创建单独的弹簧上下文。这样,您的测试将完全独立于其他测试。
  2. 您可以为此测试创建精简配置。这样可以实现同样但速度更快。
  3. 创建一个首先运行此测试的测试套件。