Spring Boot Mockito测试中ObjectMapper注入异常及空指针问题排查
问题排查与解决
问题1:@Autowired注入ObjectMapper失败
原因
如果测试类使用@WebMvcTest(BookController.class)这类切片测试注解,它仅初始化Web层相关Bean,若项目中ObjectMapper的自动配置被自定义逻辑覆盖或未正常触发,就会出现找不到Bean的异常。另外,若测试类仅依赖@ExtendWith(MockitoExtension.class)而未添加Spring上下文相关注解,容器不会启动,自然无法完成注入。
解决方法
- 切片测试场景:保留
@WebMvcTest,添加@Import(ObjectMapperAutoConfiguration.class)强制加载ObjectMapper的自动配置类:
@WebMvcTest(BookController.class) @Import(ObjectMapperAutoConfiguration.class) class BookControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; // 其他Mock依赖定义 }
- 全上下文测试场景:改用
@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
相关产品推荐
相关产品推荐

