How to mock spring cloud gateway filter which uses ReactiveOAuth2AuthorizedClientManager?

71 Views Asked by At

I am writing unit test to each independent gateway filter which is extended from AbstractGatewayFilterFactory.

One such filter is GraphAPIClaims filter, in this filter I am extracting the principal from ServerWebExchange instance, getting Oauth2AuthenticationToken out of it, and using this to get Oauth2AuthorizedClient and mutating the request to add or modify request headers.

I have figured out ways to mock the steps to get upto Oauth2AuthenticationToken, but getting Oauth2AuthorizedClient by mocking is where I am stuck at, below is the code that performs the operation which is called in the reactive pipeline of my filter.

private Mono<OAuth2AuthorizedClient> authorizedClient(ServerWebExchange exchange, OAuth2AuthenticationToken oauth2Authentication) {

        String clientRegistrationId = oauth2Authentication.getAuthorizedClientRegistrationId();
        OAuth2AuthorizeRequest request = OAuth2AuthorizeRequest.withClientRegistrationId(clientRegistrationId).principal(oauth2Authentication).build();
        ReactiveOAuth2AuthorizedClientManager clientManager = (ReactiveOAuth2AuthorizedClientManager) this.clientManagerProvider.getIfAvailable();
        return clientManager == null ?
                Mono.error(new IllegalStateException(catalog.getMessage("filter.graph.oauth2.client.manager.missing",
                        null, LocaleContextHolder.getLocale()))) :
                clientManager.authorize(request);
    }

Here the issue is with mocking ReactiveOAuth2AuthorizedClientManager instance, I get null pointer exception.

My unit test is as follows:

@Test
    @Order(2)
    @Description("Test with no oauth2 authentication token")
    public void testWithNoOauth2AuthorizedClient()  {
        GraphApiClaimsGatewayFilterFactory.Config config = new GraphApiClaimsGatewayFilterFactory.Config();
        config.setForwards(getMappings());
        GraphApiClaimsGatewayFilterFactory graphApiClaimsGatewayFilterFactory = new graphApiClaimsGatewayFilterFactory(clientManagerProvider);
        GatewayFilter filter = graphApiClaimsGatewayFilterFactory.apply(config);
        MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost")
                .header("DummyHeader","DummyValue")
                .build();
        int requestHeadersSizeBeforeFilter = request.getHeaders().size();


        OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId(getWebExchangePrincipal()
                .getAuthorizedClientRegistrationId())
                .principal( "dummyPrincipal")
                .build();
        OAuth2AuthorizedClient oAuth2AuthorizedClient = mock(OAuth2AuthorizedClient.class);
        ReactiveOAuth2AuthorizedClientManager reactiveOAuth2AuthorizedClientManager = mock(ReactiveOAuth2AuthorizedClientManager.class);

        ServerWebExchange exchange = MockServerWebExchange.from(request).mutate().principal(Mono.just(getWebExchangePrincipal())).build();
        when(chain.filter(exchange)).thenReturn(Mono.empty());
        when(clientManagerProvider.getIfAvailable()).thenReturn(reactiveOAuth2AuthorizedClientManager);
        when(reactiveOAuth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest)).thenReturn(Mono.just(oAuth2AuthorizedClient));
        filter.filter(exchange,chain).subscribe();

        Set<String> filteredHeaders = exchange.getRequest().getHeaders().keySet();
        int requestHeadersSizeAfterFilter = filteredHeaders.size();

        assert requestHeadersSizeBeforeFilter == requestHeadersSizeAfterFilter;

    }
0

There are 0 best solutions below