【发布时间】: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