From 83eb8ac0eaada42b3f94819f02eff7fbf8e0019f Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 9 Dec 2022 15:46:08 -0500 Subject: [PATCH] Introduce additional constructors in MockClientHttp[Request|Response] This commit introduces additional constructors in MockClientHttpRequest and MockClientHttpResponse that were previously only present in the internal "test fixtures" in spring-web. This commit also aligns the mocks in spring-test with the test fixtures in spring-web to simplify continued maintenance of the mocks and test fixtures. Closes gh-29670 --- .../mock/http/MockHttpInputMessage.java | 14 ++- .../mock/http/MockHttpOutputMessage.java | 18 +--- .../http/client/MockClientHttpRequest.java | 35 ++++++- .../http/client/MockClientHttpResponse.java | 31 +++--- ...ufferedImageHttpMessageConverterTests.java | 32 +++---- .../ByteArrayHttpMessageConverterTests.java | 6 +- .../FormHttpMessageConverterTests.java | 4 +- .../ResourceHttpMessageConverterTests.java | 6 +- ...sourceRegionHttpMessageConverterTests.java | 4 +- .../StringHttpMessageConverterTests.java | 6 +- .../AtomFeedHttpMessageConverterTests.java | 4 +- .../RssChannelHttpMessageConverterTests.java | 4 +- .../json/GsonHttpMessageConverterTests.java | 4 +- .../json/JsonbHttpMessageConverterTests.java | 4 +- ...pingJackson2HttpMessageConverterTests.java | 4 +- .../ProtobufHttpMessageConverterTests.java | 4 +- ...ufJsonFormatHttpMessageConverterTests.java | 4 +- ...ackson2SmileHttpMessageConverterTests.java | 4 +- ...b2CollectionHttpMessageConverterTests.java | 2 +- ...2RootElementHttpMessageConverterTests.java | 4 +- ...gJackson2XmlHttpMessageConverterTests.java | 4 +- .../MarshallingHttpMessageConverterTests.java | 4 +- .../xml/SourceHttpMessageConverterTests.java | 4 +- ...ndardMultipartHttpServletRequestTests.java | 4 +- ...ializationCborHttpMessageConverterTests.kt | 4 +- ...ializationJsonHttpMessageConverterTests.kt | 4 +- ...zationProtobufHttpMessageConverterTests.kt | 4 +- .../http/MockHttpInputMessage.java | 24 +++-- .../http/MockHttpOutputMessage.java | 59 ++++++------ .../http/client/MockClientHttpRequest.java | 96 ++++++++++--------- .../http/client/MockClientHttpResponse.java | 87 ++++++++++------- 31 files changed, 270 insertions(+), 218 deletions(-) rename spring-web/src/{test/java/org/springframework => testFixtures/java/org/springframework/web/testfixture}/http/MockHttpInputMessage.java (66%) rename spring-web/src/{test/java/org/springframework => testFixtures/java/org/springframework/web/testfixture}/http/MockHttpOutputMessage.java (55%) diff --git a/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java b/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java index 9c4280ed320a..17dbd8cd90b7 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java +++ b/spring-test/src/main/java/org/springframework/mock/http/MockHttpInputMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,11 +37,17 @@ public class MockHttpInputMessage implements HttpInputMessage { private final InputStream body; - public MockHttpInputMessage(byte[] content) { - Assert.notNull(content, "Byte array must not be null"); - this.body = new ByteArrayInputStream(content); + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ + public MockHttpInputMessage(byte[] body) { + Assert.notNull(body, "Byte array must not be null"); + this.body = new ByteArrayInputStream(body); } + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ public MockHttpInputMessage(InputStream body) { Assert.notNull(body, "InputStream must not be null"); this.body = body; diff --git a/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java b/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java index 49262749960a..7e911d05ca14 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java +++ b/spring-test/src/main/java/org/springframework/mock/http/MockHttpOutputMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,31 +34,23 @@ */ public class MockHttpOutputMessage implements HttpOutputMessage { - private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; - private final HttpHeaders headers = new HttpHeaders(); private final ByteArrayOutputStream body = new ByteArrayOutputStream(1024); - /** - * Return the headers. - */ @Override public HttpHeaders getHeaders() { return this.headers; } - /** - * Return the body content. - */ @Override public OutputStream getBody() throws IOException { return this.body; } /** - * Return body content as a byte array. + * Return the body content as a byte array. */ public byte[] getBodyAsBytes() { return this.body.toByteArray(); @@ -68,12 +60,12 @@ public byte[] getBodyAsBytes() { * Return the body content interpreted as a UTF-8 string. */ public String getBodyAsString() { - return getBodyAsString(DEFAULT_CHARSET); + return getBodyAsString(StandardCharsets.UTF_8); } /** - * Return the body content as a string. - * @param charset the charset to use to turn the body content to a String + * Return the body content interpreted as a string using the supplied character set. + * @param charset the charset to use to turn the body content into a String */ public String getBodyAsString(Charset charset) { return StreamUtils.copyToString(this.body, charset); diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java index 5cdfcac89afa..a5f36472ea71 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpRequest.java @@ -25,11 +25,13 @@ import org.springframework.lang.Nullable; import org.springframework.mock.http.MockHttpOutputMessage; import org.springframework.util.Assert; +import org.springframework.web.util.UriComponentsBuilder; /** * Mock implementation of {@link ClientHttpRequest}. * * @author Rossen Stoyanchev + * @author Brian Clozel * @author Sam Brannen * @since 3.2 */ @@ -46,15 +48,25 @@ public class MockClientHttpRequest extends MockHttpOutputMessage implements Clie /** - * Default constructor. + * Create a {@code MockClientHttpRequest} with {@link HttpMethod#GET GET} as + * the HTTP request method and {@code "/"} as the {@link URI}. */ public MockClientHttpRequest() { - this.httpMethod = HttpMethod.GET; - this.uri = URI.create("/"); + this(HttpMethod.GET, URI.create("/")); } /** - * Create an instance with the given HttpMethod and URI. + * Create a {@code MockClientHttpRequest} with the given {@link HttpMethod}, + * URI template, and URI template variable values. + * @since 6.0.3 + */ + public MockClientHttpRequest(HttpMethod httpMethod, String uriTemplate, Object... vars) { + this(httpMethod, UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(vars).encode().toUri()); + } + + /** + * Create a {@code MockClientHttpRequest} with the given {@link HttpMethod} + * and {@link URI}. */ public MockClientHttpRequest(HttpMethod httpMethod, URI uri) { this.httpMethod = httpMethod; @@ -62,6 +74,9 @@ public MockClientHttpRequest(HttpMethod httpMethod, URI uri) { } + /** + * Set the HTTP method of the request. + */ public void setMethod(HttpMethod httpMethod) { this.httpMethod = httpMethod; } @@ -71,6 +86,9 @@ public HttpMethod getMethod() { return this.httpMethod; } + /** + * Set the URI of the request. + */ public void setURI(URI uri) { this.uri = uri; } @@ -80,10 +98,19 @@ public URI getURI() { return this.uri; } + /** + * Set the {@link ClientHttpResponse} to be used as the result of executing + * the this request. + * @see #execute() + */ public void setResponse(ClientHttpResponse clientHttpResponse) { this.clientHttpResponse = clientHttpResponse; } + /** + * Get the {@link #isExecuted() executed} flag. + * @see #execute() + */ public boolean isExecuted() { return this.executed; } diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java index 6886c99fb3c5..ec164e005de3 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/http/client/MockClientHttpResponse.java @@ -29,6 +29,7 @@ * Mock implementation of {@link ClientHttpResponse}. * * @author Rossen Stoyanchev + * @author Sam Brannen * @since 3.2 */ public class MockClientHttpResponse extends MockHttpInputMessage implements ClientHttpResponse { @@ -37,7 +38,17 @@ public class MockClientHttpResponse extends MockHttpInputMessage implements Clie /** - * Constructor with response body as a byte array. + * Create a {@code MockClientHttpResponse} with an empty response body and + * HTTP status code {@link HttpStatus#OK OK}. + * @since 6.0.3 + */ + public MockClientHttpResponse() { + this(new byte[0], HttpStatus.OK); + } + + /** + * Create a {@code MockClientHttpResponse} with response body as a byte array + * and the supplied HTTP status code. */ public MockClientHttpResponse(byte[] body, HttpStatusCode statusCode) { super(body); @@ -46,8 +57,8 @@ public MockClientHttpResponse(byte[] body, HttpStatusCode statusCode) { } /** - * Variant of {@link #MockClientHttpResponse(byte[], HttpStatusCode)} with a - * custom HTTP status code. + * Create a {@code MockClientHttpResponse} with response body as a byte array + * and a custom HTTP status code. * @since 5.3.17 */ public MockClientHttpResponse(byte[] body, int statusCode) { @@ -55,7 +66,8 @@ public MockClientHttpResponse(byte[] body, int statusCode) { } /** - * Constructor with response body as InputStream. + * Create a {@code MockClientHttpResponse} with response body as {@link InputStream} + * and the supplied HTTP status code. */ public MockClientHttpResponse(InputStream body, HttpStatusCode statusCode) { super(body); @@ -64,8 +76,8 @@ public MockClientHttpResponse(InputStream body, HttpStatusCode statusCode) { } /** - * Variant of {@link #MockClientHttpResponse(InputStream, HttpStatusCode)} with a - * custom HTTP status code. + * Create a {@code MockClientHttpResponse} with response body as {@link InputStream} + * and a custom HTTP status code. * @since 5.3.17 */ public MockClientHttpResponse(InputStream body, int statusCode) { @@ -86,12 +98,7 @@ public int getRawStatusCode() { @Override public String getStatusText() { - if (this.statusCode instanceof HttpStatus status) { - return status.getReasonPhrase(); - } - else { - return ""; - } + return (this.statusCode instanceof HttpStatus status ? status.getReasonPhrase() : ""); } @Override diff --git a/spring-web/src/test/java/org/springframework/http/converter/BufferedImageHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/BufferedImageHttpMessageConverterTests.java index 79f45c1e4185..f5ed0c539b72 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/BufferedImageHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/BufferedImageHttpMessageConverterTests.java @@ -22,50 +22,44 @@ import javax.imageio.ImageIO; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; -import org.springframework.util.FileCopyUtils; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; /** * Unit tests for BufferedImageHttpMessageConverter. + * * @author Arjen Poutsma * @author Rossen Stoyanchev */ -public class BufferedImageHttpMessageConverterTests { +class BufferedImageHttpMessageConverterTests { - private BufferedImageHttpMessageConverter converter; + private final BufferedImageHttpMessageConverter converter = new BufferedImageHttpMessageConverter(); - @BeforeEach - public void setUp() { - converter = new BufferedImageHttpMessageConverter(); - } @Test - public void canRead() { + void canRead() { assertThat(converter.canRead(BufferedImage.class, null)).as("Image not supported").isTrue(); assertThat(converter.canRead(BufferedImage.class, new MediaType("image", "png"))).as("Image not supported").isTrue(); } @Test - public void canWrite() { + void canWrite() { assertThat(converter.canWrite(BufferedImage.class, null)).as("Image not supported").isTrue(); assertThat(converter.canWrite(BufferedImage.class, new MediaType("image", "png"))).as("Image not supported").isTrue(); assertThat(converter.canWrite(BufferedImage.class, new MediaType("*", "*"))).as("Image not supported").isTrue(); } @Test - public void read() throws IOException { + void read() throws IOException { Resource logo = new ClassPathResource("logo.jpg", BufferedImageHttpMessageConverterTests.class); - byte[] body = FileCopyUtils.copyToByteArray(logo.getInputStream()); - MockHttpInputMessage inputMessage = new MockHttpInputMessage(body); + MockHttpInputMessage inputMessage = new MockHttpInputMessage(logo.getInputStream()); inputMessage.getHeaders().setContentType(new MediaType("image", "jpeg")); BufferedImage result = converter.read(BufferedImage.class, inputMessage); assertThat(result.getHeight()).as("Invalid height").isEqualTo(500); @@ -73,13 +67,13 @@ public void read() throws IOException { } @Test - public void write() throws IOException { + void write() throws IOException { Resource logo = new ClassPathResource("logo.jpg", BufferedImageHttpMessageConverterTests.class); BufferedImage body = ImageIO.read(logo.getFile()); MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); MediaType contentType = new MediaType("image", "png"); converter.write(body, contentType, outputMessage); - assertThat(outputMessage.getWrittenHeaders().getContentType()).as("Invalid content type").isEqualTo(contentType); + assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content type").isEqualTo(contentType); assertThat(outputMessage.getBodyAsBytes().length > 0).as("Invalid size").isTrue(); BufferedImage result = ImageIO.read(new ByteArrayInputStream(outputMessage.getBodyAsBytes())); assertThat(result.getHeight()).as("Invalid height").isEqualTo(500); @@ -87,14 +81,14 @@ public void write() throws IOException { } @Test - public void writeDefaultContentType() throws IOException { + void writeDefaultContentType() throws IOException { Resource logo = new ClassPathResource("logo.jpg", BufferedImageHttpMessageConverterTests.class); MediaType contentType = new MediaType("image", "png"); converter.setDefaultContentType(contentType); BufferedImage body = ImageIO.read(logo.getFile()); MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); converter.write(body, new MediaType("*", "*"), outputMessage); - assertThat(outputMessage.getWrittenHeaders().getContentType()).as("Invalid content type").isEqualTo(contentType); + assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content type").isEqualTo(contentType); assertThat(outputMessage.getBodyAsBytes().length > 0).as("Invalid size").isTrue(); BufferedImage result = ImageIO.read(new ByteArrayInputStream(outputMessage.getBodyAsBytes())); assertThat(result.getHeight()).as("Invalid height").isEqualTo(500); diff --git a/spring-web/src/test/java/org/springframework/http/converter/ByteArrayHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/ByteArrayHttpMessageConverterTests.java index 63c9b5aa3221..612ec0ce4cde 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/ByteArrayHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/ByteArrayHttpMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,8 @@ import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java index 5dc99e101dc1..8f65b32e05da 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java @@ -41,12 +41,12 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED; diff --git a/spring-web/src/test/java/org/springframework/http/converter/ResourceHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/ResourceHttpMessageConverterTests.java index 3bf1b9d3e3eb..2c471c825c0d 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/ResourceHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/ResourceHttpMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,9 +29,9 @@ import org.springframework.core.io.Resource; import org.springframework.http.ContentDisposition; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.util.FileCopyUtils; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/ResourceRegionHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/ResourceRegionHttpMessageConverterTests.java index 12ba56e15457..3ec8d8694c91 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/ResourceRegionHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/ResourceRegionHttpMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,8 +34,8 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRange; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.util.StringUtils; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/StringHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/StringHttpMessageConverterTests.java index 4be55e2b821a..039da7a36cd1 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/StringHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/StringHttpMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,8 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java index 69d85bdc41c4..6df1114dd242 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/feed/AtomFeedHttpMessageConverterTests.java @@ -33,8 +33,8 @@ import org.springframework.core.testfixture.xml.XmlContent; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java index 9e9d27b5c0ad..feb24f197a06 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/feed/RssChannelHttpMessageConverterTests.java @@ -29,8 +29,8 @@ import org.springframework.core.testfixture.xml.XmlContent; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java index 495a897bffab..6ece484d1678 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java @@ -31,9 +31,9 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/JsonbHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/JsonbHttpMessageConverterTests.java index f299fb85a4b8..a6727fa39146 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/JsonbHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/JsonbHttpMessageConverterTests.java @@ -31,9 +31,9 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java index 453afb514448..b5a24d345437 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java @@ -41,11 +41,11 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.lang.Nullable; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverterTests.java index 7e03d05da84e..d0128842681b 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverterTests.java @@ -26,10 +26,10 @@ import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.protobuf.Msg; import org.springframework.protobuf.SecondMsg; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufJsonFormatHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufJsonFormatHttpMessageConverterTests.java index bafe9aa29023..ad3971548c20 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufJsonFormatHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/protobuf/ProtobufJsonFormatHttpMessageConverterTests.java @@ -23,10 +23,10 @@ import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.protobuf.Msg; import org.springframework.protobuf.SecondMsg; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-web/src/test/java/org/springframework/http/converter/smile/MappingJackson2SmileHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/smile/MappingJackson2SmileHttpMessageConverterTests.java index f11d4b015e43..ad57f7d69071 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/smile/MappingJackson2SmileHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/smile/MappingJackson2SmileHttpMessageConverterTests.java @@ -23,8 +23,8 @@ import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.within; diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java index 8c2b6c590f57..270037767e8b 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java @@ -34,8 +34,8 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.http.MockHttpInputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.testfixture.http.MockHttpInputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java index 614711c1ca6c..b7c3fbfaf77c 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java @@ -37,9 +37,9 @@ import org.springframework.core.io.Resource; import org.springframework.core.testfixture.xml.XmlContent; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java index 7ce1722b97e1..f78becdb6c8d 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java @@ -26,10 +26,10 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.json.MappingJacksonValue; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/MarshallingHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/MarshallingHttpMessageConverterTests.java index 888ad9b44ba7..620c3f0d3a9f 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/MarshallingHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/MarshallingHttpMessageConverterTests.java @@ -25,14 +25,14 @@ import org.springframework.beans.TypeMismatchException; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.oxm.Marshaller; import org.springframework.oxm.MarshallingFailureException; import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java index 6de216b504ad..dccf6e1be8a5 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java @@ -43,10 +43,10 @@ import org.springframework.core.io.Resource; import org.springframework.core.testfixture.xml.XmlContent; import org.springframework.http.MediaType; -import org.springframework.http.MockHttpInputMessage; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.util.FileCopyUtils; +import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java index 529639843c71..a7590bcf2369 100644 --- a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java +++ b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,11 +21,11 @@ import org.junit.jupiter.api.Test; -import org.springframework.http.MockHttpOutputMessage; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import org.springframework.web.testfixture.servlet.MockHttpServletRequest; import org.springframework.web.testfixture.servlet.MockPart; diff --git a/spring-web/src/test/kotlin/org/springframework/http/converter/cbor/KotlinSerializationCborHttpMessageConverterTests.kt b/spring-web/src/test/kotlin/org/springframework/http/converter/cbor/KotlinSerializationCborHttpMessageConverterTests.kt index 15f457a8253f..d98e2e2d72f9 100644 --- a/spring-web/src/test/kotlin/org/springframework/http/converter/cbor/KotlinSerializationCborHttpMessageConverterTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/http/converter/cbor/KotlinSerializationCborHttpMessageConverterTests.kt @@ -32,9 +32,9 @@ import org.junit.jupiter.api.Test import org.springframework.core.Ordered import org.springframework.http.MediaType -import org.springframework.http.MockHttpInputMessage -import org.springframework.http.MockHttpOutputMessage import org.springframework.http.converter.HttpMessageNotReadableException +import org.springframework.web.testfixture.http.MockHttpInputMessage +import org.springframework.web.testfixture.http.MockHttpOutputMessage /** * Tests for the CBOR conversion using kotlinx.serialization. diff --git a/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt b/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt index de7789d7444e..2016766a209c 100644 --- a/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverterTests.kt @@ -30,9 +30,9 @@ import kotlin.reflect.typeOf import org.springframework.core.Ordered import org.springframework.core.ResolvableType import org.springframework.http.MediaType -import org.springframework.http.MockHttpInputMessage -import org.springframework.http.MockHttpOutputMessage import org.springframework.http.converter.HttpMessageNotReadableException +import org.springframework.web.testfixture.http.MockHttpInputMessage +import org.springframework.web.testfixture.http.MockHttpOutputMessage /** * Tests for the JSON conversion using kotlinx.serialization. diff --git a/spring-web/src/test/kotlin/org/springframework/http/converter/protobuf/KotlinSerializationProtobufHttpMessageConverterTests.kt b/spring-web/src/test/kotlin/org/springframework/http/converter/protobuf/KotlinSerializationProtobufHttpMessageConverterTests.kt index 5e12b0f29c4d..d74d530734e6 100644 --- a/spring-web/src/test/kotlin/org/springframework/http/converter/protobuf/KotlinSerializationProtobufHttpMessageConverterTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/http/converter/protobuf/KotlinSerializationProtobufHttpMessageConverterTests.kt @@ -25,9 +25,9 @@ import org.assertj.core.api.Assertions.assertThatExceptionOfType import org.junit.jupiter.api.Test import org.springframework.core.Ordered import org.springframework.http.MediaType -import org.springframework.http.MockHttpInputMessage -import org.springframework.http.MockHttpOutputMessage import org.springframework.http.converter.HttpMessageNotReadableException +import org.springframework.web.testfixture.http.MockHttpInputMessage +import org.springframework.web.testfixture.http.MockHttpOutputMessage import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import java.nio.charset.StandardCharsets diff --git a/spring-web/src/test/java/org/springframework/http/MockHttpInputMessage.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpInputMessage.java similarity index 66% rename from spring-web/src/test/java/org/springframework/http/MockHttpInputMessage.java rename to spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpInputMessage.java index 784ef50cd245..8b92cf246730 100644 --- a/spring-web/src/test/java/org/springframework/http/MockHttpInputMessage.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpInputMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,12 +14,14 @@ * limitations under the License. */ -package org.springframework.http; +package org.springframework.web.testfixture.http; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; import org.springframework.util.Assert; /** @@ -35,25 +37,31 @@ public class MockHttpInputMessage implements HttpInputMessage { private final InputStream body; - public MockHttpInputMessage(byte[] contents) { - Assert.notNull(contents, "'contents' must not be null"); - this.body = new ByteArrayInputStream(contents); + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ + public MockHttpInputMessage(byte[] body) { + Assert.notNull(body, "Byte array must not be null"); + this.body = new ByteArrayInputStream(body); } + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ public MockHttpInputMessage(InputStream body) { - Assert.notNull(body, "'body' must not be null"); + Assert.notNull(body, "InputStream must not be null"); this.body = body; } @Override public HttpHeaders getHeaders() { - return headers; + return this.headers; } @Override public InputStream getBody() throws IOException { - return body; + return this.body; } } diff --git a/spring-web/src/test/java/org/springframework/http/MockHttpOutputMessage.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpOutputMessage.java similarity index 55% rename from spring-web/src/test/java/org/springframework/http/MockHttpOutputMessage.java rename to spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpOutputMessage.java index c11c36db71cb..1482d673231e 100644 --- a/spring-web/src/test/java/org/springframework/http/MockHttpOutputMessage.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/MockHttpOutputMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,64 +14,61 @@ * limitations under the License. */ -package org.springframework.http; +package org.springframework.web.testfixture.http; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpOutputMessage; +import org.springframework.util.StreamUtils; /** - * @author Arjen Poutsma + * Mock implementation of {@link HttpOutputMessage}. + * * @author Rossen Stoyanchev + * @since 3.2 */ public class MockHttpOutputMessage implements HttpOutputMessage { private final HttpHeaders headers = new HttpHeaders(); - private final ByteArrayOutputStream body = new ByteArrayOutputStream(); - - private boolean headersWritten = false; - - private final HttpHeaders writtenHeaders = new HttpHeaders(); + private final ByteArrayOutputStream body = new ByteArrayOutputStream(1024); @Override public HttpHeaders getHeaders() { - return (this.headersWritten ? HttpHeaders.readOnlyHttpHeaders(this.headers) : this.headers); - } - - /** - * Return a copy of the actual headers written at the time of the call to - * getResponseBody, i.e. ignoring any further changes that may have been made to - * the underlying headers, e.g. via a previously obtained instance. - */ - public HttpHeaders getWrittenHeaders() { - return writtenHeaders; + return this.headers; } @Override public OutputStream getBody() throws IOException { - writeHeaders(); - return body; + return this.body; } + /** + * Return the body content as a byte array. + */ public byte[] getBodyAsBytes() { - writeHeaders(); - return body.toByteArray(); + return this.body.toByteArray(); } - public String getBodyAsString(Charset charset) { - byte[] bytes = getBodyAsBytes(); - return new String(bytes, charset); + /** + * Return the body content interpreted as a UTF-8 string. + */ + public String getBodyAsString() { + return getBodyAsString(StandardCharsets.UTF_8); } - private void writeHeaders() { - if (this.headersWritten) { - return; - } - this.headersWritten = true; - this.writtenHeaders.putAll(this.headers); + /** + * Return the body content interpreted as a string using the supplied character set. + * @param charset the charset to use to turn the body content into a String + */ + public String getBodyAsString(Charset charset) { + return StreamUtils.copyToString(this.body, charset); } } diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpRequest.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpRequest.java index 1ff44775cb5f..a68485c9e39c 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpRequest.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpRequest.java @@ -16,78 +16,67 @@ package org.springframework.web.testfixture.http.client; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.net.URI; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.StreamUtils; +import org.springframework.web.testfixture.http.MockHttpOutputMessage; import org.springframework.web.util.UriComponentsBuilder; /** * Mock implementation of {@link ClientHttpRequest}. * - * @author Brian Clozel * @author Rossen Stoyanchev + * @author Brian Clozel + * @author Sam Brannen + * @since 3.2 */ -public class MockClientHttpRequest implements ClientHttpRequest { - - private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; - - private final HttpHeaders headers = new HttpHeaders(); +public class MockClientHttpRequest extends MockHttpOutputMessage implements ClientHttpRequest { private HttpMethod httpMethod; private URI uri; - private final ByteArrayOutputStream body = new ByteArrayOutputStream(1024); - @Nullable private ClientHttpResponse clientHttpResponse; private boolean executed = false; + /** + * Create a {@code MockClientHttpRequest} with {@link HttpMethod#GET GET} as + * the HTTP request method and {@code "/"} as the {@link URI}. + */ public MockClientHttpRequest() { - this.httpMethod = HttpMethod.GET; - this.uri = URI.create("/"); + this(HttpMethod.GET, URI.create("/")); } - public MockClientHttpRequest(HttpMethod httpMethod, String urlTemplate, Object... vars) { - this.httpMethod = httpMethod; - this.uri = UriComponentsBuilder.fromUriString(urlTemplate).buildAndExpand(vars).encode().toUri(); + /** + * Create a {@code MockClientHttpRequest} with the given {@link HttpMethod}, + * URI template, and URI template variable values. + * @since 6.0.3 + */ + public MockClientHttpRequest(HttpMethod httpMethod, String uriTemplate, Object... vars) { + this(httpMethod, UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(vars).encode().toUri()); } - @Override - public HttpHeaders getHeaders() { - return this.headers; - } - - @Override - public OutputStream getBody() throws IOException { - return this.body; - } - - public byte[] getBodyAsBytes() { - return this.body.toByteArray(); - } - - public String getBodyAsString() { - return getBodyAsString(DEFAULT_CHARSET); + /** + * Create a {@code MockClientHttpRequest} with the given {@link HttpMethod} + * and {@link URI}. + */ + public MockClientHttpRequest(HttpMethod httpMethod, URI uri) { + this.httpMethod = httpMethod; + this.uri = uri; } - public String getBodyAsString(Charset charset) { - return StreamUtils.copyToString(this.body, charset); - } + /** + * Set the HTTP method of the request. + */ public void setMethod(HttpMethod httpMethod) { this.httpMethod = httpMethod; } @@ -97,13 +86,9 @@ public HttpMethod getMethod() { return this.httpMethod; } - @SuppressWarnings("removal") - @Override - @Deprecated - public String getMethodValue() { - return this.httpMethod.name(); - } - + /** + * Set the URI of the request. + */ public void setURI(URI uri) { this.uri = uri; } @@ -113,25 +98,46 @@ public URI getURI() { return this.uri; } + /** + * Set the {@link ClientHttpResponse} to be used as the result of executing + * the this request. + * @see #execute() + */ public void setResponse(ClientHttpResponse clientHttpResponse) { this.clientHttpResponse = clientHttpResponse; } + /** + * Get the {@link #isExecuted() executed} flag. + * @see #execute() + */ public boolean isExecuted() { return this.executed; } + /** + * Set the {@link #isExecuted() executed} flag to {@code true} and return the + * configured {@link #setResponse(ClientHttpResponse) response}. + * @see #executeInternal() + */ @Override public final ClientHttpResponse execute() throws IOException { this.executed = true; return executeInternal(); } + /** + * The default implementation returns the configured + * {@link #setResponse(ClientHttpResponse) response}. + *

Override this method to execute the request and provide a response, + * potentially different from the configured response. + */ protected ClientHttpResponse executeInternal() throws IOException { Assert.state(this.clientHttpResponse != null, "No ClientHttpResponse"); return this.clientHttpResponse; } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpResponse.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpResponse.java index ba8ed077a069..45a3829e7810 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpResponse.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/client/MockClientHttpResponse.java @@ -16,74 +16,89 @@ package org.springframework.web.testfixture.http.client; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.Assert; +import org.springframework.web.testfixture.http.MockHttpInputMessage; /** * Mock implementation of {@link ClientHttpResponse}. * * @author Rossen Stoyanchev - * @author Brian Clozel + * @author Sam Brannen + * @since 3.2 */ -public class MockClientHttpResponse implements ClientHttpResponse { +public class MockClientHttpResponse extends MockHttpInputMessage implements ClientHttpResponse { - private final HttpHeaders headers = new HttpHeaders(); - - private final HttpStatus status; - - private InputStream body; + private final HttpStatusCode statusCode; + /** + * Create a {@code MockClientHttpResponse} with an empty response body and + * HTTP status code {@link HttpStatus#OK OK}. + * @since 6.0.3 + */ public MockClientHttpResponse() { - this.status = HttpStatus.OK; + this(new byte[0], HttpStatus.OK); } - public MockClientHttpResponse(HttpStatus statusCode) { - Assert.notNull(statusCode, "HttpStatus is required"); - this.status = statusCode; + /** + * Create a {@code MockClientHttpResponse} with response body as a byte array + * and the supplied HTTP status code. + */ + public MockClientHttpResponse(byte[] body, HttpStatusCode statusCode) { + super(body); + Assert.notNull(statusCode, "HttpStatusCode must not be null"); + this.statusCode = statusCode; } - @Override - public HttpStatus getStatusCode() throws IOException { - return this.status; + /** + * Create a {@code MockClientHttpResponse} with response body as a byte array + * and a custom HTTP status code. + * @since 5.3.17 + */ + public MockClientHttpResponse(byte[] body, int statusCode) { + this(body, HttpStatusCode.valueOf(statusCode)); } - @Override - @SuppressWarnings("deprecation") - public int getRawStatusCode() throws IOException { - return this.status.value(); + /** + * Create a {@code MockClientHttpResponse} with response body as {@link InputStream} + * and the supplied HTTP status code. + */ + public MockClientHttpResponse(InputStream body, HttpStatusCode statusCode) { + super(body); + Assert.notNull(statusCode, "HttpStatusCode must not be null"); + this.statusCode = statusCode; } - @Override - public String getStatusText() throws IOException { - return this.status.getReasonPhrase(); + /** + * Create a {@code MockClientHttpResponse} with response body as {@link InputStream} + * and a custom HTTP status code. + * @since 5.3.17 + */ + public MockClientHttpResponse(InputStream body, int statusCode) { + this(body, HttpStatusCode.valueOf(statusCode)); } - @Override - public HttpHeaders getHeaders() { - return this.headers; - } @Override - public InputStream getBody() throws IOException { - return this.body; + public HttpStatusCode getStatusCode() { + return this.statusCode; } - public void setBody(byte[] body) { - Assert.notNull(body, "body is required"); - this.body = new ByteArrayInputStream(body); + @Override + @Deprecated + public int getRawStatusCode() { + return this.statusCode.value(); } - public void setBody(String body) { - Assert.notNull(body, "body is required"); - this.body = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); + @Override + public String getStatusText() { + return (this.statusCode instanceof HttpStatus status ? status.getReasonPhrase() : ""); } @Override