Testování onErrorResume() Jarní Webflux

0

Otázka

Mám servisní vrstvy pomocí Jaře Webflux a reaktor a já jsem psát unit test. Byl jsem schopen otestovat dobrý scénář odezvy, ale nejste si jisti, jak otestovat onErrorResume() pomocí StepVerifier. Také, prosím, dejte mi vědět, jestli existuje lepší způsob zpracování výjimek v mém řadič(e.g: použití switchIfEmpty())

Tady je moje metoda regulátor

    public Mono<SomeType> getInfo(Integer id) {
            return webClient
                    .get()
                    .uri(uriBuilder -> uriBuilder.path())
                    .header("", "")
                    .header("", "")
                    .header("", "")
                    .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                    .retrieve()
                    .bodyToMono(POJO.class)
                    .onErrorResume(ex -> {
                        if (ex instanceof WebFaultException)
                            return Mono.error(ex);
                        return Mono.error(new WebFaultException(ex.getMessage(), "Error on API Call", HttpStatus.INTERNAL_SERVER_ERROR));
                    });
        }
    }
2

Nejlepší odpověď

1

Můžete zesměšňovat webclient a pomocí Mockito.doThrow když webclientMock.get() je volána.


YourWebClient webclientMock = mock(YourWebClient.class);


doThrow(RuntimeException.class)
      .when(webclientMock)
      .get();

// Call your method here

 Exception exception = assertThrows(RuntimeException.class, () -> {
        YourController.getInfo(someIntValue);
    });

// If you chose to raise WebFaultException, addittionaly assert that the return values ( message, status) are the one you expected

2021-11-23 21:00:18
0

Alternativní způsob, jak otestovat své WebClient kód, aniž by museli vysmívat WebClient třída sama o sobě, jako že se může rychle stát velmi chaotický, je, aby budovat své WebClient s ExchangeFunction že se vrací ať už reakce nebo chyby můžete očekávat. Zjistil jsem, že se to být šťastný médium mezi zesměšňovat se WebClient a točí se Wiremock pro unit testy.

    @Test
    void ourTest() {
        ExchangeFunction exchangeFunction = mock(ExchangeFunction.class);
        // this can be altered to return either happy or unhappy responses        
        given(exchangeFunction.exchange(any(ClientRequest.class))).willReturn(Mono.error(new RuntimeException()));        
        WebClient webClient = WebClient.builder()
                .exchangeFunction(exchangeFunction)
                .build();

        // code under test - this should live in your service
        Mono<String> mono = webClient.get()
                .uri("http://someUrl.com")
                .retrieve()
                .bodyToMono(POJO.class)
                .onErrorResume(ex -> {
                    if (ex instanceof WebFaultException)
                        return Mono.error(ex);
                    return Mono.error(new WebFaultException(ex.getMessage(), "Error on API Call", HttpStatus.INTERNAL_SERVER_ERROR));
                });

        StepVerifier.create(mono)
                .expectError(RuntimeException.class)
                .verify();
    }

2021-11-23 20:45:22

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................