【发布时间】:2021-06-14 16:31:43
【问题描述】:
我正在为控制器端点编写一个简单的测试。
当我执行以下操作时它工作正常。
@SpringBootTest
@ContextConfiguration(classes = {
HomeController.class,
HomeControllerTest.class
})
class HomeControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private static final String URL = "/a";
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
public void test() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
Request request = new Request();
mockMvc.perform(post(URL)
.contentType("application/json")
.content(objectMapper.writeValueAsString(request))
.andExpect(status().isOk());
}
}
但我不想创建 mockMvc 并关注 webApplicationContext。
因此,尝试改用 @AutoConfigureMockMvc,如下所示。
但这不起作用。失败并出现以下错误。
java.lang.AssertionError: 预期状态: 但原为: 预期 :200 实际 :403
我做错了什么?
我的尝试引发了上述错误。
@SpringBootTest
@AutoConfigureMockMvc // using this annotation instead
@ContextConfiguration(classes = {
HomeController.class,
HomeControllerTest.class
})
class HomeControllerTest {
// wiring mockMvc instead
// no webApplicationContext autowired
@Autowired
private MockMvc mockMvc;
private static final String URL = "/a";
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
public void test() throws Exception {
Request request = new Request();
mockMvc.perform(post(URL)
.contentType("application/json")
.content(objectMapper.writeValueAsString(request))
.andExpect(status().isOk());
}
}
【问题讨论】:
-
您的注释有点矛盾。你想运行一个完整的集成测试(这是
@SpringBootTest告诉我们的)但只加载一个控制器?您可能想要@WebMvcTest(HomeController.class)而不是您现在拥有的。此外,您设置的不同之处在于您手动设置MockMvc不会启用安全性,而自动装配的 spring boot 会启用安全性(取决于 Spring Security 的可用性)。
标签: java spring spring-boot mockmvc