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

Spring Boot Mockito测试中ObjectMapper注入异常及空指针问题排查

问题排查与解决

问题1:@Autowired注入ObjectMapper失败

原因

如果测试类使用@WebMvcTest(BookController.class)这类切片测试注解,它仅初始化Web层相关Bean,若项目中ObjectMapper的自动配置被自定义逻辑覆盖或未正常触发,就会出现找不到Bean的异常。另外,若测试类仅依赖@ExtendWith(MockitoExtension.class)而未添加Spring上下文相关注解,容器不会启动,自然无法完成注入。

解决方法

  1. 切片测试场景:保留@WebMvcTest,添加@Import(ObjectMapperAutoConfiguration.class)强制加载ObjectMapper的自动配置类:
@WebMvcTest(BookController.class)
@Import(ObjectMapperAutoConfiguration.class)
class BookControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    // 其他Mock依赖定义
}
  1. 全上下文测试场景:改用@SpringBootTest配合@AutoConfigureMockMvc,启动完整Spring容器(适合需要多Bean协作的测试):
@SpringBootTest
@AutoConfigureMockMvc
class BookControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    // 其他依赖用@MockBean模拟
}

问题2:@MockitoBean注入ObjectMapper后出现NullPointerException

原因

@MockitoBean会生成ObjectMapper的Mock实例,而非具备真实序列化/反序列化能力的实例。当调用objectMapper.writeValueAsString()时,Mock实例默认返回null,导致请求体content为空,触发空指针异常。

解决方法

绝对不要Mock ObjectMapper这类工具类,必须使用真实实例:

  • 直接采用问题1中的正确注入方式即可;
  • 若需自定义配置,可在测试类中手动创建实例:
private ObjectMapper objectMapper = new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

额外检查项

  • 确认pom.xml已引入spring-boot-starter-web(默认包含Jackson依赖):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 若有自定义ObjectMapper配置类,确保它被Spring扫描到,且测试类能加载该配置。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.03 23:12:31