From d8804c798b821cca14810e2c602f24de16c8d642 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 26 Aug 2025 18:21:56 +0300 Subject: [PATCH] RestTestClient correctly exposes the response body Closes gh-35385 --- .../web/servlet/client/DefaultRestTestClient.java | 12 ++++++------ .../test/web/servlet/client/ExchangeResult.java | 14 +++++--------- .../client/samples/bind/RouterFunctionTests.java | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java b/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java index c46bdc39b5d..c6ee841720e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java @@ -286,33 +286,33 @@ class DefaultRestTestClient implements RestTestClient { @Override public BodySpec expectBody(Class bodyType) { - B body = this.exchangeResult.getBody(bodyType); + B body = this.exchangeResult.getClientResponse().bodyTo(bodyType); EntityExchangeResult result = new EntityExchangeResult<>(this.exchangeResult, body); return new DefaultBodySpec<>(result); } @Override public BodySpec expectBody(ParameterizedTypeReference bodyType) { - B body = this.exchangeResult.getBody(bodyType); + B body = this.exchangeResult.getClientResponse().bodyTo(bodyType); EntityExchangeResult result = initExchangeResult(body); return new DefaultBodySpec<>(result); } @Override public BodyContentSpec expectBody() { - byte[] body = this.exchangeResult.getBody(byte[].class); + byte[] body = this.exchangeResult.getClientResponse().bodyTo(byte[].class); EntityExchangeResult result = initExchangeResult(body); return new DefaultBodyContentSpec(result); } @Override public EntityExchangeResult returnResult(Class elementClass) { - return initExchangeResult(this.exchangeResult.getBody(elementClass)); + return initExchangeResult(this.exchangeResult.getClientResponse().bodyTo(elementClass)); } @Override public EntityExchangeResult returnResult(ParameterizedTypeReference elementTypeRef) { - return initExchangeResult(this.exchangeResult.getBody(elementTypeRef)); + return initExchangeResult(this.exchangeResult.getClientResponse().bodyTo(elementTypeRef)); } private EntityExchangeResult initExchangeResult(@Nullable B body) { @@ -412,7 +412,7 @@ class DefaultRestTestClient implements RestTestClient { @Override public EntityExchangeResult isEmpty() { this.result.assertWithDiagnostics(() -> - AssertionErrors.assertTrue("Expected empty body", this.result.getBody(byte[].class) == null)); + AssertionErrors.assertTrue("Expected empty body", this.result.getResponseBody() == null)); return new EntityExchangeResult<>(this.result, null); } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java b/spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java index def8eee72b6..771a9eb1e0a 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java @@ -29,7 +29,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jspecify.annotations.Nullable; -import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpRequest; @@ -160,14 +159,11 @@ public class ExchangeResult { .build(); } - @Nullable - public T getBody(Class bodyType) { - return this.clientResponse.bodyTo(bodyType); - } - - @Nullable - public T getBody(ParameterizedTypeReference bodyType) { - return this.clientResponse.bodyTo(bodyType); + /** + * Provide access to the response. For internal use to decode the body. + */ + ConvertibleClientHttpResponse getClientResponse() { + return this.clientResponse; } /** diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java index ab0a4ab0133..eb0ddc5208f 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java @@ -16,13 +16,17 @@ package org.springframework.test.web.servlet.client.samples.bind; +import java.nio.charset.StandardCharsets; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.test.web.servlet.client.EntityExchangeResult; import org.springframework.test.web.servlet.client.RestTestClient; import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.ServerResponse; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.web.servlet.function.RequestPredicates.GET; import static org.springframework.web.servlet.function.RouterFunctions.route; @@ -50,4 +54,15 @@ class RouterFunctionTests { .expectBody(String.class).isEqualTo("It works!"); } + @Test + void testEntityExchangeResult() { + EntityExchangeResult result = this.testClient.get().uri("/test") + .exchange() + .expectStatus().isOk() + .expectBody() + .returnResult(); + + assertThat(result.getResponseBody()).isEqualTo("It works!".getBytes(StandardCharsets.UTF_8)); + } + }