diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java index 2cbe2f2e35..dfe54d29dc 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java @@ -1099,6 +1099,34 @@ class WebClientIntegrationTests { .verifyComplete(); } + @ParameterizedWebClientTest + void mapBodyInOnStatus(ClientHttpConnector connector) { + startServer(connector); + + prepareResponse(response -> response + .setResponseCode(500) + .setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .setBody("{\"fooValue\":\"bar\"}") + ); + + Mono result = this.webClient.get() + .uri("/json") + .retrieve() + .onStatus(HttpStatus::isError, response -> + response.bodyToMono(Foo.class) + .flatMap(foo -> Mono.error(new MyException(foo.getFooValue()))) + ) + .bodyToMono(String.class); + + StepVerifier.create(result) + .consumeErrorWith(throwable -> { + assertThat(throwable).isInstanceOf(MyException.class); + MyException error = (MyException) throwable; + assertThat(error.getMessage()).isEqualTo("bar"); + }) + .verify(); + } + private void prepareResponse(Consumer consumer) { MockResponse response = new MockResponse();