【问题标题】:Spring Boot integration tests: @AutoConfigureMockMvc and context cachingSpring Boot 集成测试:@AutoConfigureMockMvc 和上下文缓存
【发布时间】:2017-07-30 08:18:52
【问题描述】:

我正在使用 Spring Boot 1.5.1 构建非常基本的 Web 应用程序,并希望创建用于检查 REST 端点的集成测试。 根据文档的建议,可能会使用 MockMvc。

这是一个非常简单的测试类:

package foo.bar.first;

import ...

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApplicationTest1 {

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private MockMvc mvc;

    @Test
    public void shouldStartWebApplicationContext() {
        assertThat(context).isNotNull();
    }

    @Test
    public void shouldReplyToPing() throws Exception {
        mvc.perform(get("/ping"))
                .andExpect(status().isOk());
    }
}

正如预期的那样,它会启动完整的应用程序上下文并运行测试。

后来我创建了其他类似的测试类,并注意到为每个测试类启动了全新的新应用程序上下文。实验表明,上下文仅在同一包中的测试类之间共享。

例如,如果同一个测试类被复制了多次,那么上下文如下:

foo.bar
  first
    ApplicationTest1 (shared context)
    ApplicationTest2 (shared context)
  second
    ApplicationTest3 (brand new context)

另外进一步的调查表明它与@AutoConfigureMockMvc注解有关。如果注释和 MockMvc 相关的测试用例被移除,那么所有三个类都成功共享相同的上下文

那么问题是如何使用 MockMvc 获得所有测试的共享上下文

注意:其他资源建议使用MockMvcBuilders.webAppContextSetup(context).build() 获取 MockMvc 实例,但它对我不起作用(它在处理 Web 请求时不涉及过滤器)。

【问题讨论】:

  • 我也有同样的问题。我发现的唯一解决方法是不使用mockMvc 而使用TestRestTemplate,这绝对不是一个好的解决方案。
  • 您是否尝试过在基类中设置 mockmvc 并为每个测试套件扩展该类?我也很好奇为什么你需要测试来共享上下文?`我喜欢 spring.io 博客中的this setup。单独测试每个控制器。
  • 你看到这篇文章了吗? stackoverflow.com/questions/40236904/…
  • “我也很好奇你为什么需要测试来共享上下文?” @PärNilsson,正如我在问题中提到的那样,我正在运行 integration 测试,我的想法是运行整个 Web 层以及底层服务以测试它们如何协同工作。

标签: spring-mvc spring-boot junit spring-mvc-test


【解决方案1】:

这似乎是 Spring Boot 1.5 引入的一个 Bug: https://github.com/spring-projects/spring-boot/issues/9282

您可以尝试降级到 Spring Boot 1.4.x 或等待修复版本(计划下一个版本 1.5.5)。

更新: 除了“@AutoConfigureMockMvc”,您还可以手动配置您的 MockMVC: https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-mockmvc.html

手动配置 MockMVC 在我的项目上运行良好。
“处理网络请求时不涉及过滤器”是什么意思?

【讨论】:

  • 我正在运行集成测试,检查 Web 层如何与服务协同工作。我的一些功能依赖于 Web 请求过滤器,这些过滤器反过来提取标头参数并将它们传递给服务。因此,为了实现网络+服务集成,我还需要过滤器。
猜你喜欢
  • 2017-06-28
  • 2015-10-16
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2020-04-24
  • 2017-10-27
相关资源
最近更新 更多