如何在JUnit测试上下文引入Spring Security OAuth2相关Bean?
问题原因
使用@SpringJUnitConfig(Application.class)加载测试上下文时,会扫描到新增的WebClientConfig类,但@SpringJUnitConfig不会自动启用Spring Boot的自动配置机制——而OAuth2AuthorizedClientManager通常是由Spring Boot的OAuth2自动配置类(如OAuth2ClientAutoConfiguration)创建的。相比之下,@SpringBootTest会自动启用这些自动配置,所以能正常运行。
解决方案
1. 排除无关配置类,只加载测试所需组件
既然测试只需要验证ToServiceFactory的功能,完全可以排除WebClientConfig这类无关配置,避免不必要的依赖加载。
修改测试类:
@SpringJUnitConfig( classes = {ToServiceFactory.class}, excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = WebClientConfig.class ) ) class ToServiceFactoryTest { private final ToServiceFactory serviceFactory; @Autowired ToServiceFactoryTest(ToServiceFactory serviceFactory) { this.serviceFactory = serviceFactory; } // 单元测试代码... }
如果ToService实现类是通过@Service注解自动扫描的,也可以指定它们所在的包扫描,同时排除WebClientConfig:
@SpringJUnitConfig( basePackages = "com.yourpackage.toservices", excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = WebClientConfig.class ) ) class ToServiceFactoryTest { // ... }
2. Mock缺失的OAuth2AuthorizedClientManager Bean
如果不想排除配置类,可以用@MockBean快速生成一个Mock实例,满足WebClientConfig的依赖需求,同时不影响ToServiceFactory的测试逻辑。
修改测试类:
@SpringJUnitConfig(Application.class) class ToServiceFactoryTest { @MockBean private OAuth2AuthorizedClientManager authorizedClientManager; private final ToServiceFactory serviceFactory; @Autowired ToServiceFactoryTest(ToServiceFactory serviceFactory) { this.serviceFactory = serviceFactory; } // 单元测试代码... }
@MockBean会自动将这个Mock实例注册到Spring上下文,解决Bean缺失的问题。
3. 给WebClientConfig添加条件化加载
从代码结构优化的角度,可以给WebClientConfig添加条件注解,让它只在特定环境或配置下生效,测试环境自动跳过加载。
修改WebClientConfig:
@Configuration @ConditionalOnProperty( name = "oauth2.client.enabled", havingValue = "true", matchIfMissing = true ) public class WebClientConfig { @Bean public WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) { ServletOAuth2AuthorizedClientExchangeFilterFunction filter = new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); return WebClient.builder().apply(filter.oauth2Configuration()).build(); } }
然后在测试资源目录下的application-test.properties中添加:
oauth2.client.enabled=false
这样测试时就不会加载WebClientConfig,自然也不会依赖OAuth2AuthorizedClientManager。
内容的提问来源于stack exchange,提问作者Migwel

