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

时间:2014-01-20 16:59:58

标签: 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开始时进入调试模式(假设test1已经执行过)我可以看到jMockContext仍然保持来自test1的期望,执行清单和错误(如果有的话) 那么,最后几个问题,@DirtiesContext是否真的会导致重新加载Spring上下文(正如我从Spring Docs中所理解的那样)或者我是否误解了注释?在第一种情况下,我做错了什么?在后一种情况下,如何为每次测试强制重新加载Spring上下文?

编辑,以划定问题:我有一个像上面的示例代码运行了几天,然后今天我创建了一个新的测试,其中我添加了一个失败的期望。然后,我看到班级中的所有其他测试都因为同样的原因失败了(直到今天它们都在green)。调试时,我发现jMockContext从未被清除,这意味着所有测试都在同一个池中增加了期望:当然,只要没有期望失败,这是透明的,我没有注意到它({{1添加并传递很少的期望,test1需要一个非空的期望值ALREADY通过并添加自己的所以没有问题),但我不喜欢以前的情况,我想开始每个测试没有先前设定的期望。

1 个答案:

答案 0 :(得分:17)

这是我的解决方案。我不知道这是否仅限于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

没有必要改变。