diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index 2534de667a..6b0e23a95d 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java @@ -30,7 +30,6 @@ import java.util.function.Function; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.io.ByteArrayResource; @@ -40,14 +39,11 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.ClientHttpRequest; -import org.springframework.http.client.reactive.ClientHttpResponse; import org.springframework.lang.Nullable; import org.springframework.test.util.JsonExpectationsHelper; import org.springframework.util.Assert; import org.springframework.util.MimeType; import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.BodyExtractor; -import org.springframework.web.reactive.function.BodyExtractors; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.WebClient; @@ -56,8 +52,6 @@ import org.springframework.web.util.UriBuilder; import static java.nio.charset.StandardCharsets.UTF_8; import static org.springframework.test.util.AssertionErrors.assertEquals; import static org.springframework.test.util.AssertionErrors.assertTrue; -import static org.springframework.web.reactive.function.BodyExtractors.toFlux; -import static org.springframework.web.reactive.function.BodyExtractors.toMono; /** * Default implementation of {@link WebTestClient}. @@ -266,11 +260,6 @@ class DefaultWebTestClient implements WebTestClient { return this; } - @Override - public ResponseSpec exchange() { - return toResponseSpec(this.bodySpec.exchange()); - } - @Override public RequestHeadersSpec body(BodyInserter inserter) { this.bodySpec.body(inserter); @@ -289,8 +278,9 @@ class DefaultWebTestClient implements WebTestClient { return this; } - private DefaultResponseSpec toResponseSpec(Mono mono) { - ClientResponse clientResponse = mono.block(getTimeout()); + @Override + public ResponseSpec exchange() { + ClientResponse clientResponse = this.bodySpec.exchange().block(getTimeout()); Assert.state(clientResponse != null, "No ClientResponse"); ExchangeResult exchangeResult = wiretapConnector.claimRequest(this.requestId); return new DefaultResponseSpec(exchangeResult, clientResponse, this.uriTemplate, getTimeout()); @@ -298,54 +288,23 @@ class DefaultWebTestClient implements WebTestClient { } - private static class UndecodedExchangeResult extends ExchangeResult { + private static class DefaultResponseSpec implements ResponseSpec { + + private final ExchangeResult result; private final ClientResponse response; private final Duration timeout; - UndecodedExchangeResult(ExchangeResult result, ClientResponse response, + + DefaultResponseSpec(ExchangeResult result, ClientResponse response, @Nullable String uriTemplate, Duration timeout) { - super(result, uriTemplate); + this.result = new ExchangeResult(result, uriTemplate); this.response = response; this.timeout = timeout; } - public EntityExchangeResult decode(BodyExtractor, ? super ClientHttpResponse> extractor) { - T body = this.response.body(extractor).block(this.timeout); - return new EntityExchangeResult<>(this, body); - } - - public EntityExchangeResult> decodeToList(BodyExtractor, ? super ClientHttpResponse> extractor) { - Flux flux = this.response.body(extractor); - List body = flux.collectList().block(this.timeout); - return new EntityExchangeResult<>(this, body); - } - - public FluxExchangeResult decodeToFlux(BodyExtractor, ? super ClientHttpResponse> extractor) { - Flux body = this.response.body(extractor); - return new FluxExchangeResult<>(this, body, this.timeout); - } - - public EntityExchangeResult decodeToByteArray() { - ByteArrayResource resource = this.response.body(toMono(ByteArrayResource.class)).block(this.timeout); - byte[] body = (resource != null ? resource.getByteArray() : null); - return new EntityExchangeResult<>(this, body); - } - } - - - private static class DefaultResponseSpec implements ResponseSpec { - - private final UndecodedExchangeResult result; - - DefaultResponseSpec( - ExchangeResult result, ClientResponse response, @Nullable String uriTemplate, Duration timeout) { - - this.result = new UndecodedExchangeResult(result, response, uriTemplate, timeout); - } - @Override public StatusAssertions expectStatus() { return new StatusAssertions(this.result, this); @@ -358,42 +317,59 @@ class DefaultWebTestClient implements WebTestClient { @Override public BodySpec expectBody(Class bodyType) { - return new DefaultBodySpec<>(this.result.decode(toMono(bodyType))); + B body = this.response.bodyToMono(bodyType).block(this.timeout); + EntityExchangeResult entityResult = new EntityExchangeResult<>(this.result, body); + return new DefaultBodySpec<>(entityResult); } @Override public BodySpec expectBody(ParameterizedTypeReference bodyType) { - return new DefaultBodySpec<>(this.result.decode(toMono(bodyType))); + B body = this.response.bodyToMono(bodyType).block(this.timeout); + EntityExchangeResult entityResult = new EntityExchangeResult<>(this.result, body); + return new DefaultBodySpec<>(entityResult); } @Override public ListBodySpec expectBodyList(Class elementType) { - return new DefaultListBodySpec<>(this.result.decodeToList(toFlux(elementType))); + return getListBodySpec(this.response.bodyToFlux(elementType)); } @Override public ListBodySpec expectBodyList(ParameterizedTypeReference elementType) { - return new DefaultListBodySpec<>(this.result.decodeToList(toFlux(elementType))); + Flux flux = this.response.bodyToFlux(elementType); + return getListBodySpec(flux); + } + + private ListBodySpec getListBodySpec(Flux flux) { + List body = flux.collectList().block(this.timeout); + EntityExchangeResult> entityResult = new EntityExchangeResult<>(this.result, body); + return new DefaultListBodySpec<>(entityResult); } @Override public BodyContentSpec expectBody() { - return new DefaultBodyContentSpec(this.result.decodeToByteArray()); + ByteArrayResource resource = this.response.bodyToMono(ByteArrayResource.class).block(this.timeout); + byte[] body = (resource != null ? resource.getByteArray() : null); + EntityExchangeResult entityResult = new EntityExchangeResult<>(this.result, body); + return new DefaultBodyContentSpec(entityResult); } @Override public FluxExchangeResult returnResult() { - return this.result.decodeToFlux(BodyExtractors.toDataBuffers()); + Flux body = this.response.bodyToFlux(DataBuffer.class); + return new FluxExchangeResult<>(this.result, body, this.timeout); } @Override public FluxExchangeResult returnResult(Class elementType) { - return this.result.decodeToFlux(toFlux(elementType)); + Flux body = this.response.bodyToFlux(elementType); + return new FluxExchangeResult<>(this.result, body, this.timeout); } @Override public FluxExchangeResult returnResult(ParameterizedTypeReference elementType) { - return this.result.decodeToFlux(toFlux(elementType)); + Flux body = this.response.bodyToFlux(elementType); + return new FluxExchangeResult<>(this.result, body, this.timeout); } }