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

谢谢大家的鱼

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

@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我通过定义了JUnitRuleMockeryplus几个模拟对象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但是,似乎没有重新加载Spring上下文:实际上,在test2(可能test1早些时候已执行)的开始处以调试模式进入时,jMockContext仍然可以看到期望,执行列表和错误(如果有)test1
所以,最后有几个问题,@DirtiesContext真的导致Spring上下文被重新加载(据我从Spring Docs了解),还是我误解了注释?在第一种情况下,我在做什么错?在后一种情况下,如何强制为每个测试重新加载Spring上下文?

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

谢谢大家的鱼

这是我的解决方案。我不知道这是否仅限于Spring 3.2还是一个普遍的误解,但是仅仅使用@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)它不足以使整个Spring上下文为每个测试重新加载。我还必须添加DirtiesContextTestExecutionListenerin @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

没什么要改变的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用DB的Spring Boot应用程序-使用@DirtiesContext重新创建上下文后,测试类失败

来自分类Dev

未加载Spring上下文

来自分类Dev

未加载Spring上下文

来自分类Dev

重新加载或刷新测试方法中的Spring应用程序上下文?

来自分类Dev

在Eclipse中独立运行所有JUnit测试,每次都重新加载Spring上下文

来自分类Dev

Spring递归加载应用程序上下文

来自分类Dev

在tomcat上部署后未加载Spring上下文

来自分类Dev

在Atmosphere的MeteorServlet中使用Spring DispatcherServlet时,Spring上下文会加载两次

来自分类Dev

Spring上下文动态变化

来自分类Dev

Spring REST模拟上下文路径

来自分类Dev

Spring Boot和上下文路径

来自分类Dev

了解Spring MVC中的上下文

来自分类Dev

用于DelegatingFilterProxy的单独Spring上下文

来自分类Dev

Spring安全上下文,几个用户

来自分类Dev

找不到Spring Application上下文

来自分类Dev

了解Spring MVC中的上下文

来自分类Dev

Spring上下文动态变化

来自分类Dev

Spring Integration多上下文

来自分类Dev

用于DelegatingFilterProxy的单独Spring上下文

来自分类Dev

Spring安全上下文,几个用户

来自分类Dev

Thymeleaf Spring Mail上下文错误

来自分类Dev

找不到Spring Application上下文

来自分类Dev

上下文之间的Spring Integration通信

来自分类Dev

spring paypal api上下文问题

来自分类Dev

Spring 测试:缺少 servlet 上下文

来自分类Dev

是否可以在 spring-boot 应用程序之外访问 spring 上下文?

来自分类Dev

没有Spring MVC的Spring Web上下文

来自分类Dev

Spring QueryDSL从Spring上下文设置会话

来自分类Dev

在 spring 5 中与孩子共享父 spring 上下文