22

我使用SpringJUnit4ClassRunner来编写集成测试。我还@DirtiesContext用于将上下文置于损坏状态的测试,并且效果很好。

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

如何在我的测试中强制重新创建 Spring 上下文,然后它将使用更改后的系统属性?

4

3 回答 3

23

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
   ..
}
于 2015-08-08T08:47:16.243 回答
17

春季前 4.2:

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

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

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

于 2013-01-11T12:22:08.040 回答
1

有几种选择:

  1. 您可以通过将另一个配置加载到其中来为此测试创建单独的弹簧上下文。这样,您的测试将完全独立于其他所有测试。
  2. 您可以为此测试创建精简配置。这将实现相同但更快。
  3. 创建一个首先运行此测试的测试套件。
于 2013-01-11T12:47:18.673 回答