Spring Boot 集成测试:@AutoConfigureMockMvc 和上下文缓存

Posted

技术标签:

【中文标题】Spring Boot 集成测试:@AutoConfigureMockMvc 和上下文缓存【英文标题】:Spring Boot integration tests: @AutoConfigureMockMvc and context caching 【发布时间】: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,这绝对不是一个好的解决方案。 这个答案可能会有所帮助。 ***.com/a/41051585/1849366https://***.com/a/… 您是否尝试过在基类中设置 mockmvc 并为每个测试套件扩展该类?我也很好奇为什么你需要测试来共享上下文?`我喜欢 spring.io 博客中的this setup。单独测试每个控制器。 你看到这篇文章了吗? ***.com/questions/40236904/… “我也很好奇你为什么需要测试来共享上下文?” @PärNilsson,正如我在问题中提到的那样,我正在运行 integration 测试,我的想法是运行整个 Web 层以及底层服务以测试它们如何协同工作。 【参考方案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 请求过滤器,这些过滤器反过来提取标头参数并将它们传递给服务。因此,为了实现网络+服务集成,我还需要过滤器。

以上是关于Spring Boot 集成测试:@AutoConfigureMockMvc 和上下文缓存的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 集成测试(业务层)

Spring Boot教程14——集成测试

Elasticsearch Spring boot 集成测试

Spring Boot集成Junit测试

使用放心的spring-boot集成测试

Spring Boot 集成测试:模拟环境接口