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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:24:04