如何在弹簧测试中仅重新创建选定的弹簧上下文?

时间:2016-03-03 08:32:03

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

典型的例子是:

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

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

以下是几点说明:

  1. 带有mock的上下文似乎首先被加载,因为其他依赖 上下文没有这样的bean。
  2. 创建并注入模拟时 在依赖的上下文中,可能无法缓存/重用 依赖上下文。
  3. 那么有没有办法重新创建模拟创建的弹簧上下文,但是保留其他上下文?

2 个答案:

答案 0 :(得分:1)

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

  

那么有没有办法重新创建模拟创建的弹簧上下文,但是保留其他上下文?

不,这是不可能的。

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

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

基本上有两种方法可以达到这个目的。

  1. 如果将模拟注入到集成测试中(例如,通过@Autowired),您只需重置 之后 方法中的模拟(例如, JUnit 4中的@After方法。
  2. 否则,您可以实现并注册一个自定义TestExecutionListener,从ApplicationContext检索模拟的bean并重置它们(例如,在afterTestMethod()方法中)。
  3. 此致

    Sam( Spring TestContext Framework的作者

答案 1 :(得分:0)

您可以使用@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)

这样,只需要重新加载上下文,请参阅Testing