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

如何在JUnit测试上下文引入Spring Security OAuth2相关Bean?

问题解决:@SpringJUnitConfig测试中缺失OAuth2AuthorizedClientManager 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:56:18