spring - Spring @DirtiesContext 是否重新加载 Spring 上下文?

标签 spring junit4 jmock

我有一个看起来像的测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class TestClass {
  @Rule @Resource public JUnitRuleMockery jMockContext;

  public void test1() {
    //Expectations and test
  }
  public void test2() {
    //Expectations and test
  }
}

并在 test-context.xml我定义了 JUnitRuleMockery通过 factory-method 加上几个模拟对象, 喜欢
<bean id="mockContextFactory" class="MockContextFactory" />

<bean id="jMockContext" factory-bean="mockContextFactory" factory-method="getContext" scope="prototype" />

<bean id="firstMock" factory-bean="mockContextFactory" factory-method="getFirstMock" />

<bean id="secondMock" factory-bean="mockContextFactory" factory-method="getSecondMock" />
MockContextFactory
public class MockContextFactory
{
  private JUnitRuleMockery jUnitRuleMockery;

  public MockContextFactory() {
    jUnitRuleMockery = new JUnitRuleMockery();
    jUnitRuleMockery.setThreadingPolicy(new Synchroniser());
  }

  public JUnitRuleMockery getContext() {
    return jUnitRuleMockery;
  }

  public FirstMock getFirstMock() {
    return jUnitRuleMockery.mock(FirstMock.class);
  }
  //others getter
}

TestClass我有几种测试方法,并且由于注释 @DirtiesContext ,我期望在每次测试执行后重新加载 Spring 上下文(因为每个测试都对模拟对象设置了期望,所以我每次都必须重新加载 Spring 上下文)。见 @DirtiesContext from here .但是,似乎没有重新加载Spring上下文:实际上是在test2开头进入 Debug模式(据说test1之前已经执行过了)我可以看到jMockContext仍然持有来自 test1 的预期、执行列表和错误(如果有) .
所以,最后有几个问题,@DirtiesContext真的会导致重新加载 Spring 上下文(正如我从 Spring Docs 中理解的那样)还是我误解了注释?在第一种情况下,我做错了什么?在后一种情况下,如何强制为每个测试重新加载 Spring 上下文?

编辑 ,来界定问题:我有一个类似上面示例的代码从几天开始运行,然后今天我创建了一个新测试,其中我添加了一个失败的期望。然后,我看到类(class)中的所有其他测试都出于同样的原因失败(而他们在 green 直到今天)。调试,发现jMockContext从未被清除,这意味着所有测试都将期望添加到同一个池中:当然,只要没有期望失败,那就是透明的,我没有注意到(test1 添加并通过了很少的期望,test2 需要一个非空的期望池已经通过并添加了自己的期望池,因此没有问题),但我不喜欢以前的情况,我想开始每个测试时根本没有预先设定的期望值。

最佳答案

这是我的解决方案。我不知道这是否仅限于 Spring 3.2 或者这是一个普遍的误解,而只是使用 @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)不足以导致为每个测试重新加载整个 Spring 上下文。我还必须添加 DirtiesContextTestExecutionListener@TestExecutionListeners .
所以,最后,对我有用的只是改变我的 TestClass 的注释。到

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@TestExecutionListeners({DirtiesContextTestExecutionListener.class})
public abstract class TestClass

没有什么需要改变的。

关于spring - Spring @DirtiesContext 是否重新加载 Spring 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239875/

相关文章:

java - 如何对调用私有(private)方法链的方法进行单元测试?

java - CXF WebService 的 Spring 配置得到 java.lang.NoClassDefFoundError : javax/xml/ws/EndpointReference

java - 将bean注入(inject)到spring java配置类中

performance - 是否可以并行运行 JUnit 理论?

java - JMock 期望 IllegalArgumentException

java - 当要模拟的方法有多个参数时,如何使用 Jmock 编写自定义约束

spring - faces-config.xml 中的 EL 解析器

java - Spring Sentry 集成。事件处理器不工作(阻止健康检查)

java - 从 Junit 4 迁移到 Junit 5 - 测试用例被跳过

java - mock - 意外的期望 - 不知道我做错了什么