@EnableMongoAuditing@WebMvcTest单测报MappingMongoConverter注入失败
问题本质
这个报错的核心是切片测试的上下文加载范围不匹配,并不是你真的缺了MappingMongoConverter的Bean定义,完全不需要手动在测试里创建这个Bean:
- 你用的
@WebMvcTest是Web层专用的切片测试注解,默认只会加载和Spring MVC处理请求相关的组件,不会触发Spring Data MongoDB的自动装配流程,所以上下文里本来就不会有MappingMongoConverter、MongoTemplate这类Mongo体系的默认Bean。 - 但你主启动类上标注的
@EnableMongoAuditing是全局生效的,会在当前加载的测试上下文里强制注册mongoAuditingHandlerBean,这个Bean的创建逻辑强依赖MappingMongoConverter实例,切片上下文里没有对应依赖,直接抛出找不到Bean的异常。 - 主应用启动运行正常,是因为主应用加载的是全量Spring上下文,Spring Data Mongo的自动配置会提前把所有依赖的Bean(包括Converter、审计处理器)都注册完成,不存在依赖链路断裂的问题。
可落地的解决方式
根据你的测试场景选对应方案即可,没必要为了绕开报错手动写MappingMongoConverter的Bean(反而会把不必要的Mongo组件引入Web层测试,拉长测试启动时间):
- 纯Web层测试场景:排除Mongo相关的自动配置
如果你测Controller接口本来就不需要用到Mongo审计、Mongo持久化的逻辑,直接在测试类上排除会触发Mongo组件加载的自动配置类即可:
这种方式完全贴合@WebMvcTest(TestController.class) @ImportAutoConfiguration(exclude = { MongoDataAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class }) public class TestTest { @Autowired MockMvc mockMvc; @MockBean TestService testService; // 原有测试逻辑不变 }@WebMvcTest的设计初衷,测试启动速度最快。 - 集成测试场景:替换为全量上下文加载的测试注解
如果你本来的测试意图是走完整的应用链路,只是想顺便测Web接口的逻辑,就不要用切片注解,换用全量上下文加载的注解即可:
这种场景下所有Spring自动配置都会正常加载,Mongo相关的依赖会被正常注册,自然不会出现依赖缺失的问题。@SpringBootTest @AutoConfigureMockMvc public class TestTest { @Autowired MockMvc mockMvc; @MockBean TestService testService; // 原有测试逻辑不变 } - 临时救急场景:给审计Bean提供占位依赖
如果必须在切片测试里保留@EnableMongoAuditing的生效逻辑,也不需要手写完整的MappingMongoConverter,只需要给审计处理器提供空的占位配置,绕开Bean加载的依赖检查即可:@WebMvcTest(TestController.class) public class TestTest { @Autowired MockMvc mockMvc; @MockBean TestService testService; @TestConfiguration static class AuditingPlaceholderConfig { @Bean public MongoAuditingHandler mongoAuditingHandler() { // 空实现占位,不触发真实的审计逻辑 return new MongoAuditingHandler(MappingMongoConverter.defaultConstructor()); } } // 原有测试逻辑不变 }
内容的提问来源于stack exchange,提问作者jota87r
相关产品推荐
相关产品推荐

