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

Spring Boot2.6.7 JUnit5测试Controller报UserDetailsServiceImpl Bean缺失错误

问题原因

@WebMvcTest是Spring Boot提供的MVC层切片测试注解,默认仅加载Controller、MVC配置、拦截器、过滤器等Web层关联的Bean,不会自动扫描注册@Service、@Repository、@Component这类非Web层的普通组件。
你的WebSecurityConfig属于Spring Security的Web安全配置,会被@WebMvcTest自动加载,但它依赖的UserDetailsServiceImpl标注了@Service,不在切片测试默认加载的Bean范围内,因此测试启动时抛出找不到对应Bean的错误。

解决方法

根据测试场景选择对应方案即可:

  • 方案1:Mock掉缺失的依赖Bean,适合仅验证Controller层逻辑、不需要真实权限校验流程的场景
    直接在测试类TutorialControllerTest中添加模拟Bean的声明:
    @MockBean
    UserDetailsServiceImpl userDetailsService;
    
    如果WebSecurityConfig中还有其他依赖Bean(比如密码编码器PasswordEncoder),也一并通过@MockBean注入模拟实例即可。
  • 方案2:需要走真实Spring Security校验逻辑时,调整切片测试的加载范围
    给@WebMvcTest添加配置,排除默认的安全自动配置,手动指定要加载的安全配置类:
    @WebMvcTest(
      controllers = TutorialController.class,
      excludeAutoConfiguration = SecurityAutoConfiguration.class
    )
    @Import(WebSecurityConfig.class)
    
    注意这种方式需要把UserDetailsServiceImpl依赖的其他组件(比如操作用户表的Repository)也一并注册或Mock,否则仍会出现注入失败的问题。
  • 方案3:不需要切片测试的速度优势、要加载完整应用上下文时,替换测试注解
    去掉@WebMvcTest,改用@SpringBootTest搭配@AutoConfigureMockMvc,这种方式会启动完整的Spring容器,所有标注了Spring注解的Bean都会被扫描注册,不会出现Bean找不到的问题,缺点是测试启动速度远慢于切片测试:
    @ExtendWith(SpringExtension.class)
    @ActiveProfiles("test")
    @SpringBootTest
    @AutoConfigureMockMvc
    public class TutorialControllerTest {
        // 原有测试代码保持不变
    }
    

内容的提问来源于stack exchange,提问作者duke666

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:09:18