Reputation: 151
Having some issues correctly setting up @RestClientTest
that is using a RestClient
with the new OAuth Interceptor that will be available in Spring Boot 3.4. The particular RestClient
requires the OAuth2AuthorizedClientManager
bean which I assume is not being injected when running the @RestClientTest
test slice. Any suggestions on a solution I can use because I'd like to avoid spinning up the entire Spring Boot context (i.e., use @SpringBootTest
).
This is my RestClientConfig
@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);
}
My test class
@RestClientTest(RestClient.class)
@AutoConfigureWireMock(port = 0})
@ActiveProfiles({"test"})
@Import(RestClientConfig.class)
@AutoConfigureMockRestServiceServer(enabled = false)
class RestClientTest {
@Autowired
RestClient RestClient;
@Test
void test1() {
}
}
As expected, the error I'm getting,
Unsatisfied dependency expressed through method 'restClient' parameter 1: No qualifying bean of type 'org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager'
[UPDATE] After looking at the link provided by @jcompetence I added a test configuration that loads all the required beans.
@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;
}
}
Upvotes: 0
Views: 71