Spring集成测试中MockMvc.perform抛出NullPointerException问题求助
问题原因与修复方案
核心错误点
- 注解拼写错误:测试类中
@MockBea拼写错误,正确应为@MockBean,导致Spring上下文无法为控制器注入模拟的OutputService实例,上下文初始化失败,最终MockMvc没有被成功注入为null,调用perform方法时报空指针。 - 变量拼写错误:测试方法中定义的路径变量为
getOutputMapping,调用时误写为getOuputMapping(缺了字母t)。 - 模拟对象使用错误:你在测试方法内单独通过
Mockito.mock创建了一个OutputService实例,但这个实例没有被注入到Spring上下文中,控制器依赖的是测试类上注解注入的全局模拟实例,单独创建的实例打桩不会生效。 - 路径参数定义不匹配(非报错直接原因,建议修复):控制器的GetMapping路径参数名为
{id},测试中写为{systemID},虽然按位置传参不影响执行,但不便于维护。
修复后的测试类代码
@WebMvcTest(OutputController.class) public class OutputControllerTests { @Autowired private MockMvc mockMvc; // 修复注解拼写 @MockBean OutputService outputService; @Test public void returnOutputForValidId() throws Exception { // 直接给Spring注入的模拟实例打桩,不需要单独创建mock when(outputService.findOutputById("TEST")).thenReturn("Test output"); // 路径参数名和控制器对齐 String getOutputMapping = "/output/{id}"; String id = "TEST"; // 修复变量拼写错误 mockMvc.perform(get(getOutputMapping, id)) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("Test output")); } }
验证说明
修复后重新运行测试,空指针异常会消失,打桩的返回结果会正确被控制器返回,测试可正常通过。
内容的提问来源于stack exchange,提问作者ejh97
相关产品推荐
相关产品推荐

