Spring Boot 3.4中@RestClientTest集成Azure OAuth遇依赖问题求解
场景
在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
相关产品推荐
相关产品推荐

