Spring Boot使用@AutoConfigureMockMvc测试无法注入ObjectMapper报错
问题原因与解决方案
根因分析
该问题分为两种常见场景:
- 场景1:仅IDE(多为IntelliJ IDEA)静态检查报错,实际运行测试无任何异常。这是IDE的校验误报:
@WebMvcTest作为Web层切片测试注解,默认加载包括Jackson自动配置在内的所有Web层依赖,IDE可以直接识别到ObjectMapperBean的存在;而@AutoConfigureMockMvc本身不会触发IDE的自动配置识别逻辑,虽然Spring Boot默认开启了Jackson自动配置,运行时Bean真实存在,但IDE静态检查没有感知到,就会抛出该错误提示。 - 场景2:运行测试时实际抛出
No beans of 'ObjectMapper' type found异常。通常是以下原因导致:- 项目启动类或测试类手动排除了
JacksonAutoConfiguration,导致Spring不会自动注册ObjectMapperBean - 自定义了
ObjectMapper实例但没有添加@Bean注解将其注册到Spring容器 @SpringBootTest指定了非Web类型的webEnvironment配置,不会加载Jackson相关的Web层配置
- 项目启动类或测试类手动排除了
解决办法
针对场景1(IDE误报)
- 方案1:直接忽略IDE提示,不影响测试的正常运行
- 方案2:在测试类上补充添加
@AutoConfigureJson注解,主动触发IDE对Jackson配置的识别,即可消除报错 - 方案3:无需依赖注入,直接手动初始化
ObjectMapper,代码如下:
private final ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
针对场景2(运行时报错)
- 方案1:检查启动类、测试类的注解配置,移除对
JacksonAutoConfiguration的排除规则 - 方案2:如果是自定义的
ObjectMapper,给对应的实例化方法添加@Bean注解,将其注册到Spring容器 - 方案3:调整
@SpringBootTest的webEnvironment配置,明确指定为Web环境即可,示例:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc class EventControllerTest { // 原有测试代码 }
额外优化提示:Spring Boot 2.2及以上版本中,@SpringBootTest已经默认集成了@ExtendWith(SpringExtension.class),可以直接删除这行冗余配置。
内容的提问来源于stack exchange,提问作者Jaeyeon
相关产品推荐
相关产品推荐

