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
相关产品推荐
相关产品推荐

