You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:52:19