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

Vit*_*jok 12 junit spring-mvc spring-mvc-test spring-boot

我正在使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

正如所料,它启动完整的应用程序上下文并运行测试.

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

例如,如果多次复制相同的测试类,则上下文如下:

foo.bar
  first
    ApplicationTest1 (shared context)
    ApplicationTest2 (shared context)
  second
    ApplicationTest3 (brand new context)
Run Code Online (Sandbox Code Playgroud)

进一步的调查表明它与@AutoConfigureMockMvc注释有关.如果删除了注释和MockMvc相关的测试用例,则所有三个类都成功共享相同的上下文.

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

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

bra*_*etz 4

这似乎是 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 在我的项目中运行良好。
“处理网络请求时不涉及过滤器”是什么意思?