Spring Boot Web应用测试用例避空指针及重定向属性问题咨询
解决Spring Web重定向测试中的NullPointerException问题
看起来你在测试Spring控制器的重定向逻辑时遇到了NullPointerException,我来帮你梳理下问题根源和解决办法:
1. 核心问题分析
你的控制器代码里,savedCommand.getId()抛出NPE的核心原因,大概率是测试中没有正确模拟employeeService.saveEmployeeCommand()的返回值——默认情况下,Mock对象的方法会返回null,导致savedCommand为null,调用getId()时直接触发空指针异常。
2. 最直接的解决:Mock Service的返回值
用Mockito这类Mock框架,强制让service的save方法返回你预先创建的EmployeeCommand对象,确保它不会返回null。这里给你一个完整的测试示例:
import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.beans.factory.annotation.Autowired; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; @WebMvcTest(YourEmployeeController.class) // 替换成你的实际控制器类名 public class EmployeeControllerTest { @Autowired private MockMvc mockMvc; @Mock private EmployeeService employeeService; @Test public void saveEmployee_ShouldRedirectToEmployeeDetail() throws Exception { // Given EmployeeCommand testCommand = new EmployeeCommand(); testCommand.setId(2L); // 关键一步:告诉Mock的service,当传入这个testCommand时,返回它自己(或者你想要的对象) when(employeeService.saveEmployeeCommand(testCommand)).thenReturn(testCommand); // When & Then:模拟POST请求,验证重定向地址是否正确 mockMvc.perform(post("/employee") .flashAttr("employeeCommand", testCommand)) .andExpect(redirectedUrl("/employee/2")); } }
3. 给控制器加一层安全防护(可选但推荐)
如果你的业务逻辑里,save方法确实有可能返回null(比如参数校验失败、数据库保存出错),那最好在控制器里加个null判断,从根源避免NPE:
@RequestMapping("/employee") public String saveEmployee(@ModelAttribute EmployeeCommand commandObject){ EmployeeCommand savedCommand = employeeService.saveEmployeeCommand(commandObject); // 先检查savedCommand和它的ID是否为null if(savedCommand == null || savedCommand.getId() == null){ // 这里可以重定向到错误页面,或者回到表单页并携带错误提示 return "redirect:/employee/form?error=save_failed"; } return "redirect:/employee/" + savedCommand.getId(); }
4. 额外检查点
有时候NPE也可能是测试里没正确传递参数导致的——比如你没把EmployeeCommand通过flashAttr或者请求参数传给控制器,导致commandObject的必要属性为空,进而让service返回null。记得在测试里确认参数传递是正确的。
内容的提问来源于stack exchange,提问作者Maciaz
相关产品推荐
相关产品推荐

