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 和上下文缓存的主要内容,如果未能解决你的问题,请参考以下文章