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

Spring Boot 3.4中@RestClientTest集成Azure OAuth遇依赖问题求解

问题:使用@RestClientTest测试带OAuth拦截器的RestClient时缺少OAuth2AuthorizedClientManager Bean

场景

在Spring Boot 3.4中配置了带有新OAuth拦截器的RestClient,使用@RestClientTest做测试切片时遇到依赖问题:RestClient需要OAuth2AuthorizedClientManager Bean,但@RestClientTest不会自动注入该Bean,且希望避免使用@SpringBootTest启动完整Spring上下文。

RestClient配置代码

@Bean
public RestClient restClient(
        RestClient.Builder builder, OAuth2AuthorizedClientManager authorizedClientManager) {
    var client = builder.baseUrl(baseUrl)
            .requestInterceptor(new OAuth2ClientHttpRequestInterceptor(authorizedClientManager))
            .defaultRequest(request -> request.attributes(clientRegistrationId(CLIENT_REGISTRATION_ID)))
            .build();

    return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client))
            .build()
            .createClient(RestClient.class);
}

测试类代码

@RestClientTest(RestClient.class)
@AutoConfigureWireMock(port = 0)
@ActiveProfiles({"test"})
@Import(RestClientConfig.class)
@AutoConfigureMockRestServiceServer(enabled = false)
class RestClientTest {

    @Autowired
    RestClient restClient;

    @Test
    void test1() {
       
    }
}

报错信息

Unsatisfied dependency expressed through method 'restClient' parameter 1: No qualifying bean of type 'org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager'

解决方案

添加内部测试配置类,手动构建并注入所需的OAuth相关Bean:

@TestConfiguration
public static class TestConfig {

    @Value("${wiremock.server.port}")
    private int port;

    @Bean
    ClientRegistrationRepository clientRegistrationRepository() {
        var client = new AuthorizationClientProperties();
        client.setAuthorizationGrantType(CLIENT_CREDENTIALS);
        client.setScopes(List.of("application-id-test.default"));

        var aadProperties = new AadAuthenticationProperties();
        aadProperties.getAuthorizationClients().put("client-registration-id", client);
        aadProperties.getCredential().setClientId("application-id-test");
        aadProperties.getCredential().setClientSecret("client-secret-test");
        aadProperties.getProfile().getEnvironment().setActiveDirectoryEndpoint("http://localhost:" + port + "/microsoft");
        aadProperties.getProfile().setTenantId("tenant-test-id");
        return new AadClientRegistrationRepository(aadProperties);
    }

    @Bean
    OAuth2AuthorizedClientService auth2AuthorizedClientService(
            ClientRegistrationRepository clientRegistrationRepository) {
        return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);
    }

    @Bean
    OAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,
                                                          OAuth2AuthorizedClientService oAuth2AuthorizedClientService) {
        OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
                .clientCredentials()
                .build();
        var auth2AuthorizedClientManager = new AuthorizedClientServiceOAuth2AuthorizedClientManager(clientRegistrationRepository, oAuth2AuthorizedClientService);
        auth2AuthorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
        return auth2AuthorizedClientManager;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:47:23