【问题标题】:How recreate only selected spring context in spring tests?如何在弹簧测试中仅重新创建选定的弹簧上下文?
【发布时间】:2016-03-03 08:32:02
【问题描述】:

典型的例子是:

@ContextConfiguration(locations = {
        "classpath:someITTest-mock.xml",
        "classpath:someITTest-context.xml",
        "classpath:commons.xml"})
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeITTest {
//...
}

我正在寻找在测试期间重新创建模拟的方法。使用DirtiesContext 的明显方法 但它会导致重新创建所有上下文,而应该只重新创建模拟上下文。

这里有几个注意事项:

  1. 似乎首先加载了带有模拟的上下文,因为其他依赖 context 没有这样的 bean。
  2. 创建和注入模拟时 进入依赖的上下文,可能无法缓存/重用 取决于上下文。

那么有没有办法在创建 mock 的地方重新创建 spring 上下文,但保留缓存的其他上下文?

【问题讨论】:

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


    【解决方案1】:

    更新:如果您使用的是 Spring Boot 1.4,则可以通过 @MockBean 使用它对模拟 bean 的一流支持。

    那么有没有办法在创建 mock 的地方重新创建 spring 上下文,但保留其他上下文缓存?

    不,这是不可能的。

    在您的示例中,实际上只有 一个 单个 ApplicationContext 从所有三个 XML 配置文件中加载。如果您使用@ContextHierarchy 创建层次结构,则会有多个上下文;但是,仅重新加载父上下文是不可能的(请参阅我在此线程中发布的其他 cmets)。

    但是,人们在这种情况下采用的一种常见方法是显式重置有问题的模拟。

    基本上有两种方法可以实现这一点。

    1. 如果模拟被注入到集成测试中(例如,通过@Autowired),您可以简单地在 after 方法中重置模拟(例如,在 @ JUnit 4 中的 987654325@ 方法)。
    2. 否则,您可以实现并注册一个自定义 TestExecutionListener,它从 ApplicationContext 检索模拟 bean 并重置它们(例如,在 afterTestMethod() 方法中)。

    问候,

    Sam(Spring TestContext 框架的作者

    【讨论】:

      【解决方案2】:

      您可以使用@ContextHierarchy@DirtiesContext

      @ContextHierarchy({
      @ContextConfiguration(name="parent",
          locations = {"classpath:someITTest-context.xml", "classpath:commons.xml"}),
      @ContextConfiguration(name="child",
          locations = "classpath:someITTest-mock.xml")
      })
      @DirtiesContext(hierarchyMode = CURRENT_LEVEL)
      

      这样,只有 child 上下文应该被重新加载,参见Testing

      【讨论】:

      • 虽然您在示例中仅重新加载子上下文是正确的,但这可能无法解决原始问题。
      • 我假设commons.xml 依赖于someITTest-mock.xml 中声明的bean。因此,在后者中声明的模拟 bean 必须对声明在前者中的 bean 可见。使用您提出的父子层次结构,这是不可能的。父上下文看不到子上下文中定义的 bean。
      猜你喜欢
      • 2015-10-22
      • 1970-01-01
      • 2013-04-07
      • 2018-05-06
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多