2017-03-09 729 views
9

我正在使用Spring Boot 1.5.1构建非常基本的Web应用程序,并希望创建用于检查REST端点的集成测试。根据文档建议,可以使用MockMvc。Spring Boot集成测试:@AutoConfigureMockMvc和上下文高速缓存

这是非常简单的测试类:

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请求时的过滤器)。

+0

我有完全相同的问题。我发现的唯一解决方法是不使用'mockMvc'并使用'TestRestTemplate',这绝对不是一个好的解决方案。 –

+0

这个答案可能会有所帮助。 https://stackoverflow.com/a/41051585/1849366https://stackoverflow.com/a/41051585/1849366 –

+1

您是否尝试过在基类中设置mockmvc,并为每个测试套件扩展该类?我也很好奇为什么你需要测试来分享上下文?'我喜欢[这个设置](https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot -1-4)在spring.io博客中报道。独立测试每个控制器。 –

回答

2

这似乎与春天启动1.5引入了一个错误: https://github.com/spring-projects/spring-boot/issues/9282

你可以尝试降级到春季启动的1.4.x或等待固定的版本(刨下一个版本1.5.5)。

更新: 而不是 “@AutoConfigureMockMvc” 你也可以手动配置您的MockMVC: https://docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html

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

+0

我正在运行集成测试,在那里检查Web层如何与服务一起工作。我的一些功能依赖于Web请求过滤器,这些过滤器依次提取标题参数并将它们传递给服务。所以为了让Web +服务集成,我也需要过滤器。 – Vitaljok