Spring Boot 3中MockMvc注入失败:No qualifying bean异常求助
核心原因分析
你的项目同时引入了spring-boot-starter-web(Servlet栈)和spring-boot-starter-webflux(Reactive栈)依赖,Spring Boot在检测到两者共存时,会默认启用Reactive Web环境,此时Servlet栈相关的Bean(包括MockMvc)不会被容器初始化,直接导致注入失败。
具体排查步骤
清理冲突依赖
如果项目不需要Reactive能力,直接移除spring-boot-starter-webflux依赖;如果是Gateway项目,注意Gateway本身基于WebFlux实现,不支持Servlet栈,此时应该改用WebTestClient进行接口测试,而非MockMvc。强制指定Servlet环境
在测试类的@SpringBootTest注解中明确指定Web环境类型:@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc public class FooTest { // ... 测试代码 }或者在测试资源目录下添加
application-test.properties,配置:spring.main.web-application-type=servlet验证AutoConfigureMockMvc生效
尝试手动构建MockMvc,绕过自动配置验证是否可行:@Autowired private WebApplicationContext webApplicationContext; private MockMvc mvc; @BeforeEach void setUp() { mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); }如果手动构建成功,说明自动配置被其他逻辑干扰,可检查是否有自定义的测试配置类覆盖了AutoConfigureMockMvc的行为。
检查测试类扫描范围
确保测试类的包路径和主启动类(标注@SpringBootApplication的类)包路径一致,或者在@SpringBootTest中指定主启动类:@SpringBootTest(classes = YourMainApplication.class) @AutoConfigureMockMvc public class FooTest { // ... 测试代码 }检查依赖版本兼容性
确认Spring Boot 3.0.6和Spring Cloud 2022.0.2版本兼容,虽然官方标注兼容,但可尝试更新到Spring Boot 3.0.x的最新小版本,排除版本bug导致的自动配置失效。
内容的提问来源于stack exchange,提问作者mr nooby noob

