You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:04