【问题标题】:Start JUnit test with fresh Spring Context使用新的 Spring Context 开始 JUnit 测试
【发布时间】:2016-05-14 16:03:03
【问题描述】:

我使用JUnit4 编写了两个单元测试类。它们都单独运行良好,但一个接一个地运行它们(例如通过 mvn 测试),第二个测试失败。

第二个测试失败的原因是第一个测试在第一个测试中修改了一个 bean。第二个测试想要使用这个 bean 的新实例。

单元测试应该为每个单元测试类赋予一个新的上下文。 Spring 对我想禁用的上下文缓存具有一流的支持。如何配置Spring 为每个单元测试类重新启动一个新的Context

我的测试类是这样配置的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:a.context.xml")
public class AUnitTest {

  @Test
  public void someTestMethod{
    doSomeFancyStuff();
  }
}

【问题讨论】:

  • 我不再使用 Spring 进行单元测试。单元测试不应该需要依赖注入;我想使用模拟。 Spring factory 启动时间过长。
  • 只是为了让其他阅读本文的人清楚:以上内容不是单元测试。根据定义,它是一个集成测试,因为它正在加载 Spring ApplicationContext
  • 当您说“Spring 尝试优化它”时,您指的是 Spring 对上下文缓存的一流支持,恰好在 reference manual 中有完整记录。跨度>
  • 我用这些附加信息调整了原始帖子

标签: java spring unit-testing spring-test springjunit4classrunner


【解决方案1】:

您可以在测试方法(或测试类)上使用@DirtiesContext。 Spring ApplicationContext 将在测试执行后重新加载。

【讨论】:

  • 谢谢,Spring 似乎根据 ContextConfiguration 注释中的位置参数进行缓存:@DirtiesContext(classMode=ClassMode.AFTER_CLASS) 对我有用
  • 不需要指定classMode=ClassMode.AFTER_CLASS。这是默认设置!请阅读 classMode 的 Javadoc。
【解决方案2】:

您也可以在测试后使用 Mockito.reset()。 这将为您节省 Spring 上下文的加载时间。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 2018-12-06
    • 2013-09-25
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2017-08-14
    相关资源
    最近更新 更多