Almanzt
Almanzt

Reputation: 151

@RestClientTest without mocking Azure OAuth

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

Answers (0)

Related Questions