为什么MockMvc非空时调用perform方法仍抛出空指针异常
Spring Boot单元测试空指针异常原因分析
核心触发原因
你代码中MockMvc实例的注解使用存在冲突,直接导致了空指针异常:
MockMvc字段上同时标注了@Autowired和@MockBean两个冲突注解,@MockBean优先级更高,会将Spring容器中由@AutoConfigureMockMvc自动生成的真实可用MockMvc实例,替换为Mockito生成的空白mock对象- 你没有为这个空白mock对象的
perform方法配置返回规则,调用mockMvc.perform()默认返回null,后续调用null的andExpect方法就会抛出空指针,这也符合你提到的mockMvc本身不为空的验证结果。
直接修复方案
删掉MockMvc字段上的@MockBean注解,仅保留@Autowired即可,正确配置参考:
@SpringBootTest @AutoConfigureMockMvc public class ApiControlerTest { @Autowired private MockMvc mockMvc; @Test public void writeWeightMetric() throws Exception { assertNotNull(mockMvc); String json = "{\"id\": \"15\", \"measurement\": 30, \"datetime\": \"29-12-2021-15-23-39\"}"; mockMvc.perform( MockMvcRequestBuilders.post("postURI") .contentType(MediaType.APPLICATION_JSON) .content(json).accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()); } }
其他可能触发该异常的场景
- 目标Controller未被Spring容器正常扫描:如果启动类和Controller不在同一包或子包路径下,需要在
@SpringBootTest注解中指定扫描的类,确保请求可以正常路由到对应接口 - 请求路径配置错误:代码中POST路径使用了占位符
"postURI",需替换为实际的接口路径,路径不匹配会导致找不到请求处理器,返回空结果触发空指针
内容的提问来源于stack exchange,提问作者Kristjan Bulič
相关产品推荐
相关产品推荐

