Spring Boot控制器测试报错:找不到对应Service类型的合格Bean
解决方案
问题根源
@WebMvcTest默认会自动扫描并加载应用中所有标注了@Controller的组件。如果你的UserController依赖了AuthService,AuthenticationController依赖了UserService,那么运行其中一个控制器测试时,Spring会尝试加载另一个控制器及其依赖的Service,但你只Mock了当前测试类中声明的Service,导致容器找不到对应的Bean,抛出NoSuchBeanDefinitionException。
具体解决方法
方法1:精准指定测试目标控制器(推荐)
修改@WebMvcTest注解,明确指定要测试的控制器类,Spring只会加载该控制器及其直接依赖,不会加载其他控制器:
UserControllerTest修改后:
@WebMvcTest(UserController.class) // 明确指定测试的控制器 @ActiveProfiles(value = "dev") public class UserControllerTest { // 测试类无需声明为抽象类 @MockBean private UserService userService; @Test void test1() throws Exception { // 测试逻辑 } }
AuthenticationControllerTest修改后:
@WebMvcTest(AuthenticationController.class) // 明确指定测试的控制器 @ActiveProfiles(value = "dev") public class AuthenticationControllerTest { // 测试类无需声明为抽象类 @MockBean private AuthService authService; @Test void test1() throws Exception { // 测试逻辑 } }
注意:
@WebMvcTest已集成MockitoExtension的功能,可移除@ExtendWith(MockitoExtension.class)注解简化代码。
方法2:Mock所有依赖的Service
若因需求必须加载多个控制器,可在每个测试类中Mock所有需要的Service:
UserControllerTest修改后:
@WebMvcTest @ActiveProfiles(value = "dev") public class UserControllerTest { @MockBean private UserService userService; @MockBean // 额外Mock控制器依赖的AuthService private AuthService authService; @Test void test1() throws Exception { // 测试逻辑 } }
AuthenticationControllerTest修改后:
@WebMvcTest @ActiveProfiles(value = "dev") public class AuthenticationControllerTest { @MockBean private AuthService authService; @MockBean // 额外Mock控制器依赖的UserService private UserService userService; @Test void test1() throws Exception { // 测试逻辑 } }
此方式虽能解决问题,但会扩大测试上下文范围,不推荐作为首选方案。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

