Spring控制器POST重定向302状态码单元测试可行性问询
问题解答
使用@WebMvcTest结合MockMvc的单元测试完全可以捕获并校验302重定向状态码,无需启动完整服务做集成测试。你当前测试不生效是代码配置错误导致的,具体问题如下:
- 测试类上
@WebMvcTest加载的控制器错误:你填的是BasicTemplatesController.class,实际要测试的是UserController,MockMvc根本没有注册你要测的接口路由 - 错误Mock了被测类:你给
UserController加了@MockBean注解,相当于把真实的控制器实例替换成了Mock对象,不会执行真实的addUser方法逻辑,自然不会返回重定向配置 - 请求传参格式错误:你的接口用
@ModelAttribute接收表单参数,你却用ObjectMapper把DTO序列化为JSON传给接口,参数解析失败会直接进入错误分支返回200的sign-up视图,不会走重定向逻辑
修正后的测试代码
@ExtendWith(MockitoExtension.class) // 加载正确的被测控制器 @WebMvcTest(UserController.class) public class UserControllerTest { // 只Mock依赖的Service层,不要Mock被测的Controller @MockBean private UserService userService; @Autowired private MockMvc mvc; @Test @DisplayName("新增用户成功后应返回302重定向状态") void shouldCorrectlyAddUserAndReturnCreated() throws Exception { // 构造合法的表单参数提交,不要传JSON mvc.perform(post("/sign-up") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .param("userName", "Username") .param("firstName", "New") .param("lastName", "User") .param("email", "new@gmail.com") .param("password", "password") ) .andExpect(status().isFound()) // 还可以额外校验重定向的目标路径是否正确 .andExpect(redirectedUrl("/successful-sign-up")); } }
修正后执行测试就可以正常捕获到302状态码,也可以根据需求补充重定向地址校验逻辑。
内容的提问来源于stack exchange,提问作者Teatro
相关产品推荐
相关产品推荐

