Browse Source

RestTestClient correctly exposes the response body

Closes gh-35385
pull/35392/head
rstoyanchev 5 months ago
parent
commit
d8804c798b
  1. 12
      spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java
  2. 14
      spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java
  3. 15
      spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java

12
spring-test/src/main/java/org/springframework/test/web/servlet/client/DefaultRestTestClient.java

@ -286,33 +286,33 @@ class DefaultRestTestClient implements RestTestClient { @@ -286,33 +286,33 @@ class DefaultRestTestClient implements RestTestClient {
@Override
public <B> BodySpec<B, ?> expectBody(Class<B> bodyType) {
B body = this.exchangeResult.getBody(bodyType);
B body = this.exchangeResult.getClientResponse().bodyTo(bodyType);
EntityExchangeResult<B> result = new EntityExchangeResult<>(this.exchangeResult, body);
return new DefaultBodySpec<>(result);
}
@Override
public <B> BodySpec<B, ?> expectBody(ParameterizedTypeReference<B> bodyType) {
B body = this.exchangeResult.getBody(bodyType);
B body = this.exchangeResult.getClientResponse().bodyTo(bodyType);
EntityExchangeResult<B> 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<byte[]> result = initExchangeResult(body);
return new DefaultBodyContentSpec(result);
}
@Override
public <T> EntityExchangeResult<T> returnResult(Class<T> elementClass) {
return initExchangeResult(this.exchangeResult.getBody(elementClass));
return initExchangeResult(this.exchangeResult.getClientResponse().bodyTo(elementClass));
}
@Override
public <T> EntityExchangeResult<T> returnResult(ParameterizedTypeReference<T> elementTypeRef) {
return initExchangeResult(this.exchangeResult.getBody(elementTypeRef));
return initExchangeResult(this.exchangeResult.getClientResponse().bodyTo(elementTypeRef));
}
private <B> EntityExchangeResult<B> initExchangeResult(@Nullable B body) {
@ -412,7 +412,7 @@ class DefaultRestTestClient implements RestTestClient { @@ -412,7 +412,7 @@ class DefaultRestTestClient implements RestTestClient {
@Override
public EntityExchangeResult<Void> 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);
}

14
spring-test/src/main/java/org/springframework/test/web/servlet/client/ExchangeResult.java

@ -29,7 +29,6 @@ import org.apache.commons.logging.Log; @@ -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 { @@ -160,14 +159,11 @@ public class ExchangeResult {
.build();
}
@Nullable
public <T> T getBody(Class<T> bodyType) {
return this.clientResponse.bodyTo(bodyType);
}
@Nullable
public <T> T getBody(ParameterizedTypeReference<T> bodyType) {
return this.clientResponse.bodyTo(bodyType);
/**
* Provide access to the response. For internal use to decode the body.
*/
ConvertibleClientHttpResponse getClientResponse() {
return this.clientResponse;
}
/**

15
spring-test/src/test/java/org/springframework/test/web/servlet/client/samples/bind/RouterFunctionTests.java

@ -16,13 +16,17 @@ @@ -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 { @@ -50,4 +54,15 @@ class RouterFunctionTests {
.expectBody(String.class).isEqualTo("It works!");
}
@Test
void testEntityExchangeResult() {
EntityExchangeResult<byte[]> result = this.testClient.get().uri("/test")
.exchange()
.expectStatus().isOk()
.expectBody()
.returnResult();
assertThat(result.getResponseBody()).isEqualTo("It works!".getBytes(StandardCharsets.UTF_8));
}
}

Loading…
Cancel
Save