diff --git a/spring-test/src/main/java/org/springframework/test/web/client/response/ExecutingResponseCreator.java b/spring-test/src/main/java/org/springframework/test/web/client/response/ExecutingResponseCreator.java index 1e26f39f832..66e0c9a5268 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/response/ExecutingResponseCreator.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/response/ExecutingResponseCreator.java @@ -32,12 +32,13 @@ import org.springframework.util.StreamUtils; * {@code ResponseCreator} that obtains the response by executing the request * through a {@link ClientHttpRequestFactory}. This is useful in scenarios with * multiple remote services where some need to be called rather than mocked. - *

The {@code ClientHttpRequestFactory} is typically obtained from the - * {@code RestTemplate} before it is passed to {@code MockRestServiceServer}, + *

The {@code ClientHttpRequestFactory} is typically used for building the + * {@code RestClient} and is passed to {@code MockRestServiceServer}, * in effect using the original factory rather than the test factory: *


- * ResponseCreator withActualResponse = new ExecutingResponseCreator(restTemplate);
- * MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build();
+ * RestClient.Builder restClientBuilder = RestClient.builder().requestFactory(requestFactory);
+ * ResponseCreator withActualResponse = new ExecutingResponseCreator(requestFactory);
+ * MockRestServiceServer server = MockRestServiceServer.bindTo(restClientBuilder).build();
  * //...
  * server.expect(requestTo("/foo")).andRespond(withSuccess());
  * server.expect(requestTo("/bar")).andRespond(withActualResponse);
diff --git a/spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java b/spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java
index c827fbfe316..0b1659e4afd 100644
--- a/spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java
+++ b/spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java
@@ -30,7 +30,7 @@ import org.springframework.mock.http.client.MockClientHttpRequest;
 import org.springframework.mock.http.client.MockClientHttpResponse;
 import org.springframework.test.web.client.MockRestServiceServer.MockRestServiceServerBuilder;
 import org.springframework.test.web.client.response.ExecutingResponseCreator;
-import org.springframework.web.client.RestTemplate;
+import org.springframework.web.client.RestClient;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -49,65 +49,72 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat
  */
 class MockRestServiceServerTests {
 
-	private final RestTemplate restTemplate = new RestTemplate();
+	private final RestClient.Builder clientBuilder = RestClient.builder();
 
 
 	@Test
 	void buildMultipleTimes() {
-		MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.restTemplate);
+		MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.clientBuilder);
 
 		MockRestServiceServer server = builder.build();
+		RestClient restClient = this.clientBuilder.build();
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 
 		server = builder.ignoreExpectOrder(true).build();
+		restClient = this.clientBuilder.build();
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/bar", Void.class);
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 
 		server = builder.build();
+		restClient = this.clientBuilder.build();
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/bar", Void.class);
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
 		server.verify();
 	}
 
 	@Test
 	void exactExpectOrder() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder)
 				.ignoreExpectOrder(false).build();
+		RestClient restClient = this.clientBuilder.build();
 
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
 		assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
-				this.restTemplate.getForObject("/bar", Void.class));
+				restClient.get().uri("/bar").retrieve().toBodilessEntity());
 	}
 
 	@Test
 	void ignoreExpectOrder() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder)
 				.ignoreExpectOrder(true).build();
+		RestClient restClient = this.clientBuilder.build();
 
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/bar", Void.class);
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 	}
 
 	@Test
 	void executingResponseCreator() {
-		RestTemplate restTemplate = createEchoRestTemplate();
-		ExecutingResponseCreator withActualCall = new ExecutingResponseCreator(restTemplate.getRequestFactory());
+		ClientHttpRequestFactory clientRequestFactory = createEchoClientRequestFactory();
+		ExecutingResponseCreator withActualCall = new ExecutingResponseCreator(clientRequestFactory);
+		this.clientBuilder.requestFactory(clientRequestFactory);
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder).build();
+		RestClient restClient = this.clientBuilder.build();
 
-		MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build();
 		server.expect(requestTo("/profile")).andRespond(withSuccess());
 		server.expect(requestTo("/quoteOfTheDay")).andRespond(withActualCall);
 
-		var response1 = restTemplate.getForEntity("/profile", String.class);
-		var response2 = restTemplate.getForEntity("/quoteOfTheDay", String.class);
+		var response1 = restClient.get().uri("/profile").retrieve().toEntity(String.class);
+		var response2 = restClient.get().uri("/quoteOfTheDay").retrieve().toEntity(String.class);
 		server.verify();
 
 		assertThat(response1.getStatusCode().value()).isEqualTo(200);
@@ -116,8 +123,8 @@ class MockRestServiceServerTests {
 		assertThat(response2.getBody()).isEqualTo("echo from /quoteOfTheDay");
 	}
 
-	private static RestTemplate createEchoRestTemplate() {
-		ClientHttpRequestFactory requestFactory = (uri, httpMethod) -> {
+	private static ClientHttpRequestFactory createEchoClientRequestFactory() {
+		return (uri, httpMethod) -> {
 			MockClientHttpRequest request = new MockClientHttpRequest(httpMethod, uri);
 			ClientHttpResponse response = new MockClientHttpResponse(
 					("echo from " + uri.getPath()).getBytes(StandardCharsets.UTF_8),
@@ -126,61 +133,64 @@ class MockRestServiceServerTests {
 			request.setResponse(response);
 			return request;
 		};
-		return new RestTemplate(requestFactory);
 	}
 
 	@Test
 	void resetAndReuseServer() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder).build();
+		RestClient restClient = this.clientBuilder.build();
 
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 		server.reset();
 
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/bar", Void.class);
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
 		server.verify();
 	}
 
 	@Test
 	void resetAndReuseServerWithUnorderedExpectationManager() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder)
 				.ignoreExpectOrder(true).build();
+		RestClient restClient = this.clientBuilder.build();
 
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 		server.reset();
 
 		server.expect(requestTo("/foo")).andRespond(withSuccess());
 		server.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/bar", Void.class);
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 		server.verify();
 	}
 
 	@Test  // gh-24486
 	void resetClearsRequestFailures() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder).build();
+		RestClient restClient = this.clientBuilder.build();
 		server.expect(once(), requestTo("/remoteurl")).andRespond(withSuccess());
-		this.restTemplate.postForEntity("/remoteurl", null, String.class);
+		restClient.post().uri("/remoteurl").retrieve().body(String.class);
 		server.verify();
 
 		assertThatExceptionOfType(AssertionError.class)
-				.isThrownBy(() -> this.restTemplate.postForEntity("/remoteurl", null, String.class))
+				.isThrownBy(() -> restClient.post().uri("/remoteurl").retrieve().body(String.class))
 				.withMessageStartingWith("No further requests expected");
 
 		server.reset();
 
 		server.expect(once(), requestTo("/remoteurl")).andRespond(withSuccess());
-		this.restTemplate.postForEntity("/remoteurl", null, String.class);
+		restClient.post().uri("/remoteurl").retrieve().body(String.class);
 		server.verify();
 	}
 
 	@Test  // SPR-16132
 	void followUpRequestAfterFailure() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder).build();
+		RestClient restClient = this.clientBuilder.build();
 
 		server.expect(requestTo("/some-service/some-endpoint"))
 				.andRespond(request -> { throw new SocketException("pseudo network error"); });
@@ -189,11 +199,11 @@ class MockRestServiceServerTests {
 				.andExpect(method(POST)).andRespond(withSuccess());
 
 		try {
-			this.restTemplate.getForEntity("/some-service/some-endpoint", String.class);
+			restClient.get().uri("/some-service/some-endpoint").retrieve().body(String.class);
 			fail("Expected exception");
 		}
 		catch (Exception ex) {
-			this.restTemplate.postForEntity("/reporting-service/report-error", ex.toString(), String.class);
+			restClient.post().uri("/reporting-service/report-error").retrieve().body(String.class);
 		}
 
 		server.verify();
@@ -201,12 +211,13 @@ class MockRestServiceServerTests {
 
 	@Test  // gh-21799
 	void verifyShouldFailIfRequestsFailed() {
-		MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
+		MockRestServiceServer server = MockRestServiceServer.bindTo(this.clientBuilder).build();
 		server.expect(once(), requestTo("/remoteurl")).andRespond(withSuccess());
+		RestClient restClient = this.clientBuilder.build();
 
-		this.restTemplate.postForEntity("/remoteurl", null, String.class);
+		restClient.post().uri("/remoteurl").retrieve().body(String.class);
 		assertThatExceptionOfType(AssertionError.class)
-				.isThrownBy(() -> this.restTemplate.postForEntity("/remoteurl", null, String.class))
+				.isThrownBy(() -> restClient.post().uri("/remoteurl").retrieve().body(String.class))
 				.withMessageStartingWith("No further requests expected");
 
 		assertThatExceptionOfType(AssertionError.class)
@@ -216,24 +227,26 @@ class MockRestServiceServerTests {
 
 	@Test
 	void verifyWithTimeout() {
-		MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.restTemplate);
+		MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.clientBuilder);
 
 		MockRestServiceServer server1 = builder.build();
+		RestClient restClient = this.clientBuilder.build();
 		server1.expect(requestTo("/foo")).andRespond(withSuccess());
 		server1.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/foo", Void.class);
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
 
 		assertThatThrownBy(() -> server1.verify(Duration.ofMillis(100))).hasMessage("""
 				Further request(s) expected leaving 1 unsatisfied expectation(s).
 				1 request(s) executed:
-				GET /foo, headers: [Accept:"application/json, application/*+json"]
+				GET /foo
 				""");
 
 		MockRestServiceServer server2 = builder.build();
+		restClient = this.clientBuilder.build();
 		server2.expect(requestTo("/foo")).andRespond(withSuccess());
 		server2.expect(requestTo("/bar")).andRespond(withSuccess());
-		this.restTemplate.getForObject("/foo", Void.class);
-		this.restTemplate.getForObject("/bar", Void.class);
+		restClient.get().uri("/foo").retrieve().toBodilessEntity();
+		restClient.get().uri("/bar").retrieve().toBodilessEntity();
 
 		server2.verify(Duration.ofMillis(100));
 	}
diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/SampleTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/SampleTests.java
index 156534080fd..2a3ead04972 100644
--- a/spring-test/src/test/java/org/springframework/test/web/client/samples/SampleTests.java
+++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/SampleTests.java
@@ -17,8 +17,8 @@
 package org.springframework.test.web.client.samples;
 
 import java.io.IOException;
-import java.util.Collections;
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import org.springframework.core.io.ClassPathResource;
@@ -32,7 +32,7 @@ import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.test.web.Person;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.util.FileCopyUtils;
-import org.springframework.web.client.RestTemplate;
+import org.springframework.web.client.RestClient;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -46,17 +46,24 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat
 /**
  * Examples to demonstrate writing client-side REST tests with Spring MVC Test.
  *
- * 

While the tests in this class invoke the RestTemplate directly, in actual - * tests the RestTemplate may likely be invoked indirectly, i.e. through client + *

While the tests in this class invoke the RestClient directly, in actual + * tests the RestClient may likely be invoked indirectly, i.e. through client * code. * * @author Rossen Stoyanchev */ class SampleTests { - private final RestTemplate restTemplate = new RestTemplate(); + private RestClient restClient; - private final MockRestServiceServer mockServer = MockRestServiceServer.bindTo(this.restTemplate).ignoreExpectOrder(true).build(); + private MockRestServiceServer mockServer; + + @BeforeEach + void setup() { + RestClient.Builder clientBuilder = RestClient.builder(); + this.mockServer = MockRestServiceServer.bindTo(clientBuilder).ignoreExpectOrder(true).build(); + this.restClient = clientBuilder.build(); + } @Test @@ -67,7 +74,7 @@ class SampleTests { .andRespond(withSuccess(responseBody, MediaType.APPLICATION_JSON)); @SuppressWarnings("unused") - Person ludwig = this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + Person ludwig = this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); // We are only validating the request. The response is mocked out. // hotel.getId() == 42 @@ -84,15 +91,15 @@ class SampleTests { .andRespond(withSuccess(responseBody, MediaType.APPLICATION_JSON)); @SuppressWarnings("unused") - Person ludwig = this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + Person ludwig = this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); // We are only validating the request. The response is mocked out. // hotel.getId() == 42 // hotel.getName().equals("Holiday Inn") - this.restTemplate.getForObject("/composers/{id}", Person.class, 42); - this.restTemplate.getForObject("/composers/{id}", Person.class, 42); - this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); + this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); + this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); this.mockServer.verify(); } @@ -106,7 +113,7 @@ class SampleTests { this.mockServer.expect(never(), requestTo("/composers/43")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess(responseBody, MediaType.APPLICATION_JSON)); - this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); this.mockServer.verify(); } @@ -120,9 +127,9 @@ class SampleTests { this.mockServer.expect(never(), requestTo("/composers/43")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess(responseBody, MediaType.APPLICATION_JSON)); - this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); assertThatExceptionOfType(AssertionError.class).isThrownBy(() -> - this.restTemplate.getForObject("/composers/{id}", Person.class, 43)); + this.restClient.get().uri("/composers/{id}", 43).retrieve().body(Person.class)); } @Test @@ -133,7 +140,7 @@ class SampleTests { .andRespond(withSuccess(responseBody, MediaType.APPLICATION_JSON)); @SuppressWarnings("unused") - Person ludwig = this.restTemplate.getForObject("/composers/{id}", Person.class, 42); + Person ludwig = this.restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); // hotel.getId() == 42 // hotel.getName().equals("Holiday Inn") @@ -156,11 +163,11 @@ class SampleTests { .andRespond(withSuccess("8", MediaType.TEXT_PLAIN)); @SuppressWarnings("unused") - String result1 = this.restTemplate.getForObject("/number", String.class); + String result1 = this.restClient.get().uri("/number").retrieve().body(String.class); // result1 == "1" @SuppressWarnings("unused") - String result2 = this.restTemplate.getForObject("/number", String.class); + String result2 = this.restClient.get().uri("/number").retrieve().body(String.class); // result == "2" try { @@ -175,18 +182,17 @@ class SampleTests { void repeatedAccessToResponseViaResource() { Resource resource = new ClassPathResource("ludwig.json", getClass()); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setInterceptors(Collections.singletonList(new ContentInterceptor(resource))); - - MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate) + RestClient.Builder clientBuilder = RestClient.builder().requestInterceptor(new ContentInterceptor(resource)); + MockRestServiceServer mockServer = MockRestServiceServer.bindTo(clientBuilder) .ignoreExpectOrder(true) .bufferContent() // enable repeated reads of response body .build(); + RestClient restClient = clientBuilder.build(); mockServer.expect(requestTo("/composers/42")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess(resource, MediaType.APPLICATION_JSON)); - restTemplate.getForObject("/composers/{id}", Person.class, 42); + restClient.get().uri("/composers/{id}", 42).retrieve().body(Person.class); mockServer.verify(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/ContentRequestMatchersIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/ContentRequestMatchersIntegrationTests.java index 5b346eda041..f3251a7e50a 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/ContentRequestMatchersIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/ContentRequestMatchersIntegrationTests.java @@ -16,17 +16,12 @@ package org.springframework.test.web.client.samples.matchers; -import java.net.URI; -import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.test.web.Person; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.hamcrest.Matchers.startsWith; @@ -44,15 +39,16 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat */ class ContentRequestMatchersIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); + private RestClient restClient; - private final MockRestServiceServer mockServer = MockRestServiceServer.createServer(this.restTemplate); + private MockRestServiceServer mockServer; @BeforeEach void setup() { - this.restTemplate.setMessageConverters( - List.of(new StringHttpMessageConverter(), new JacksonJsonHttpMessageConverter())); + RestClient.Builder clientBuilder = RestClient.builder(); + this.mockServer = MockRestServiceServer.createServer(clientBuilder); + this.restClient = clientBuilder.build(); } @@ -89,7 +85,7 @@ class ContentRequestMatchersIntegrationTests { } private void executeAndVerify(Object body) { - this.restTemplate.put(URI.create("/foo"), body); + this.restClient.put().uri("/foo").body(body).retrieve().toBodilessEntity(); this.mockServer.verify(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/HeaderRequestMatchersIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/HeaderRequestMatchersIntegrationTests.java index 79d43c00e4f..ad0ce34b224 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/HeaderRequestMatchersIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/HeaderRequestMatchersIntegrationTests.java @@ -16,18 +16,13 @@ package org.springframework.test.web.client.samples.matchers; -import java.net.URI; -import java.util.List; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.test.web.Person; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; @@ -43,22 +38,23 @@ class HeaderRequestMatchersIntegrationTests { private static final String RESPONSE_BODY = "{\"name\" : \"Ludwig van Beethoven\", \"someDouble\" : \"1.6035\"}"; - private final RestTemplate restTemplate = new RestTemplate(); + private RestClient restClient; - private final MockRestServiceServer mockServer = MockRestServiceServer.createServer(this.restTemplate); + private MockRestServiceServer mockServer; @BeforeEach void setup() { - this.restTemplate.setMessageConverters( - List.of(new StringHttpMessageConverter(), new JacksonJsonHttpMessageConverter())); + RestClient.Builder clientBuilder = RestClient.builder(); + this.mockServer = MockRestServiceServer.createServer(clientBuilder); + this.restClient = clientBuilder.build(); } @Test void string() { this.mockServer.expect(requestTo("/person/1")) - .andExpect(header("Accept", "application/json, application/*+json")) + .andExpect(header("Accept", "application/json")) .andRespond(withSuccess(RESPONSE_BODY, MediaType.APPLICATION_JSON)); executeAndVerify(); @@ -74,7 +70,7 @@ class HeaderRequestMatchersIntegrationTests { } private void executeAndVerify() { - this.restTemplate.getForObject(URI.create("/person/1"), Person.class); + this.restClient.get().uri("/person/1").accept(MediaType.APPLICATION_JSON).retrieve().body(Person.class); this.mockServer.verify(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/JsonPathRequestMatchersIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/JsonPathRequestMatchersIntegrationTests.java index 79ceef25325..0402323928a 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/JsonPathRequestMatchersIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/JsonPathRequestMatchersIntegrationTests.java @@ -16,18 +16,17 @@ package org.springframework.test.web.client.samples.matchers; -import java.net.URI; import java.util.Arrays; -import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; +import org.springframework.http.MediaType; import org.springframework.test.web.Person; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.endsWith; @@ -64,10 +63,16 @@ class JsonPathRequestMatchersIntegrationTests { } - private final RestTemplate restTemplate = - new RestTemplate(Collections.singletonList(new JacksonJsonHttpMessageConverter())); + private RestClient restClient; - private final MockRestServiceServer mockServer = MockRestServiceServer.createServer(this.restTemplate); + private MockRestServiceServer mockServer; + + @BeforeEach + void setup() { + RestClient.Builder clientBuilder = RestClient.builder(); + this.mockServer = MockRestServiceServer.createServer(clientBuilder); + this.restClient = clientBuilder.build(); + } @Test @@ -179,7 +184,8 @@ class JsonPathRequestMatchersIntegrationTests { } private void executeAndVerify() { - this.restTemplate.put(URI.create("/composers"), people); + this.restClient.put().uri("/composers").contentType(MediaType.APPLICATION_JSON) + .body(people).retrieve().toBodilessEntity(); this.mockServer.verify(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XmlContentRequestMatchersIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XmlContentRequestMatchersIntegrationTests.java index 4f01a8fad26..d10566360b8 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XmlContentRequestMatchersIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XmlContentRequestMatchersIntegrationTests.java @@ -16,8 +16,6 @@ package org.springframework.test.web.client.samples.matchers; -import java.net.URI; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -29,11 +27,11 @@ import jakarta.xml.bind.annotation.XmlRootElement; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.MediaType; import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.test.web.Person; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import static org.hamcrest.Matchers.hasXPath; import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; @@ -61,7 +59,7 @@ class XmlContentRequestMatchersIntegrationTests { private MockRestServiceServer mockServer; - private RestTemplate restTemplate; + private RestClient restClient; private PeopleWrapper people; @@ -76,13 +74,11 @@ class XmlContentRequestMatchersIntegrationTests { this.people = new PeopleWrapper(composers); - List> converters = new ArrayList<>(); - converters.add(new Jaxb2RootElementHttpMessageConverter()); + RestClient.Builder clientBuilder = RestClient.builder().configureMessageConverters(converters -> + converters.registerDefaults().withXmlConverter(new Jaxb2RootElementHttpMessageConverter())); - this.restTemplate = new RestTemplate(); - this.restTemplate.setMessageConverters(converters); - - this.mockServer = MockRestServiceServer.createServer(this.restTemplate); + this.mockServer = MockRestServiceServer.createServer(clientBuilder); + this.restClient = clientBuilder.build(); } @Test @@ -106,7 +102,8 @@ class XmlContentRequestMatchersIntegrationTests { } private void executeAndVerify() { - this.restTemplate.put(URI.create("/composers"), this.people); + this.restClient.put().uri("/composers").contentType(MediaType.APPLICATION_XML) + .body(this.people).retrieve().toBodilessEntity(); this.mockServer.verify(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XpathRequestMatchersIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XpathRequestMatchersIntegrationTests.java index 83560ae174f..03b009527ae 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XpathRequestMatchersIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/samples/matchers/XpathRequestMatchersIntegrationTests.java @@ -16,8 +16,6 @@ package org.springframework.test.web.client.samples.matchers; -import java.net.URI; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -31,11 +29,11 @@ import jakarta.xml.bind.annotation.XmlRootElement; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.MediaType; import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.test.web.Person; import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; @@ -61,7 +59,7 @@ class XpathRequestMatchersIntegrationTests { private MockRestServiceServer mockServer; - private RestTemplate restTemplate; + private RestClient restClient; private PeopleWrapper people; @@ -80,13 +78,11 @@ class XpathRequestMatchersIntegrationTests { this.people = new PeopleWrapper(composers, performers); - List> converters = new ArrayList<>(); - converters.add(new Jaxb2RootElementHttpMessageConverter()); + RestClient.Builder clientBuilder = RestClient.builder().configureMessageConverters(converters -> + converters.registerDefaults().withXmlConverter(new Jaxb2RootElementHttpMessageConverter())); - this.restTemplate = new RestTemplate(); - this.restTemplate.setMessageConverters(converters); - - this.mockServer = MockRestServiceServer.createServer(this.restTemplate); + this.mockServer = MockRestServiceServer.createServer(clientBuilder); + this.restClient = clientBuilder.build(); } @@ -190,7 +186,8 @@ class XpathRequestMatchersIntegrationTests { } private void executeAndVerify() { - this.restTemplate.put(URI.create("/composers"), this.people); + this.restClient.put().uri("/composers").contentType(MediaType.APPLICATION_XML) + .body(this.people).retrieve().toBodilessEntity(); this.mockServer.verify(); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/AsyncIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/AsyncIntegrationTests.java index 1a28f0b4042..62fb33937bb 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/AsyncIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/AsyncIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.http.server.reactive; -import java.net.URI; import java.time.Duration; import reactor.core.publisher.Flux; @@ -25,9 +24,7 @@ import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -51,8 +48,7 @@ class AsyncIntegrationTests extends AbstractHttpHandlerIntegrationTests { void basicTest(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + port); - ResponseEntity response = new RestTemplate().exchange(RequestEntity.get(url).build(), String.class); + ResponseEntity response = getRestClient().get().retrieve().toEntity(String.class); assertThat(response.getBody()).isEqualTo("hello"); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/CookieIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/CookieIntegrationTests.java index 62cf57caaa4..8bc6f77a7d8 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/CookieIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/CookieIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.http.server.reactive; -import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -24,10 +23,8 @@ import java.util.Map; import reactor.core.publisher.Mono; import org.springframework.http.HttpCookie; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -52,10 +49,9 @@ class CookieIntegrationTests extends AbstractHttpHandlerIntegrationTests { public void basicTest(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + port); - String header = "SID=31d4d96e407aad42; lang=en-US"; - ResponseEntity response = new RestTemplate().exchange( - RequestEntity.get(url).header("Cookie", header).build(), Void.class); + ResponseEntity response = getRestClient().get() + .header("Cookie", "SID=31d4d96e407aad42; lang=en-US") + .retrieve().toBodilessEntity(); Map> requestCookies = this.cookieHandler.requestCookies; assertThat(requestCookies).hasSize(2); @@ -79,10 +75,9 @@ class CookieIntegrationTests extends AbstractHttpHandlerIntegrationTests { public void partitionedAttributeTest(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + port); - String header = "SID=31d4d96e407aad42; lang=en-US"; - ResponseEntity response = new RestTemplate().exchange( - RequestEntity.get(url).header("Cookie", header).build(), Void.class); + ResponseEntity response = getRestClient().get() + .header("Cookie", "SID=31d4d96e407aad42; lang=en-US") + .retrieve().toBodilessEntity(); List headerValues = response.getHeaders().get("Set-Cookie"); assertThat(headerValues).hasSize(2); @@ -97,10 +92,9 @@ class CookieIntegrationTests extends AbstractHttpHandlerIntegrationTests { public void cookiesWithSameNameTest(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = new URI("http://localhost:" + port); - String header = "SID=31d4d96e407aad42; lang=en-US; lang=zh-CN"; - new RestTemplate().exchange( - RequestEntity.get(url).header("Cookie", header).build(), Void.class); + ResponseEntity response = getRestClient().get() + .header("Cookie", "SID=31d4d96e407aad42; lang=en-US; lang=zh-CN") + .retrieve().toBodilessEntity(); Map> requestCookies = this.cookieHandler.requestCookies; assertThat(requestCookies).hasSize(2); diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/EchoHandlerIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/EchoHandlerIntegrationTests.java index 6f23686544b..29a76747adb 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/EchoHandlerIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/EchoHandlerIntegrationTests.java @@ -16,14 +16,11 @@ package org.springframework.http.server.reactive; -import java.net.URI; import java.util.Random; import reactor.core.publisher.Mono; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -49,11 +46,8 @@ class EchoHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { public void echo(HttpServer httpServer) throws Exception { startServer(httpServer); - RestTemplate restTemplate = new RestTemplate(); - byte[] body = randomBytes(); - RequestEntity request = RequestEntity.post(URI.create("http://localhost:" + port)).body(body); - ResponseEntity response = restTemplate.exchange(request, byte[].class); + ResponseEntity response = getRestClient().post().body(body).retrieve().toEntity(byte[].class); assertThat(response.getBody()).isEqualTo(body); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ErrorHandlerIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ErrorHandlerIntegrationTests.java index c4e28886c14..a0b11e83cad 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ErrorHandlerIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ErrorHandlerIntegrationTests.java @@ -21,10 +21,9 @@ import java.net.URI; import reactor.core.publisher.Mono; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.NoOpResponseErrorHandler; -import org.springframework.web.client.ResponseErrorHandler; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; import org.springframework.web.testfixture.http.server.reactive.bootstrap.JettyCoreHttpServer; @@ -37,8 +36,6 @@ import static org.assertj.core.api.Assertions.assertThat; */ class ErrorHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { - private static final ResponseErrorHandler NO_OP_ERROR_HANDLER = new NoOpResponseErrorHandler(); - private final ErrorHandler handler = new ErrorHandler(); @@ -47,16 +44,20 @@ class ErrorHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { return handler; } + @Override + protected RestClient initRestClient(RestClient.Builder builder) { + return builder + .defaultStatusHandler(HttpStatusCode::is5xxServerError, (req, res) -> {}) + .defaultStatusHandler(HttpStatusCode::is4xxClientError, (req, res) -> {}) + .build(); + } @ParameterizedHttpServerTest void responseBodyError(HttpServer httpServer) throws Exception { startServer(httpServer); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setErrorHandler(NO_OP_ERROR_HANDLER); - - URI url = URI.create("http://localhost:" + port + "/response-body-error"); - ResponseEntity response = restTemplate.getForEntity(url, String.class); + ResponseEntity response = getRestClient().get().uri("/response-body-error") + .retrieve().toEntity(String.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -65,11 +66,8 @@ class ErrorHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { void handlingError(HttpServer httpServer) throws Exception { startServer(httpServer); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setErrorHandler(NO_OP_ERROR_HANDLER); - - URI url = URI.create("http://localhost:" + port + "/handling-error"); - ResponseEntity response = restTemplate.getForEntity(url, String.class); + ResponseEntity response = getRestClient().get().uri("/handling-error") + .retrieve().toEntity(String.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -78,11 +76,10 @@ class ErrorHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { void emptyPathSegments(HttpServer httpServer) throws Exception { startServer(httpServer); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setErrorHandler(NO_OP_ERROR_HANDLER); - URI url = URI.create("http://localhost:" + port + "//"); - ResponseEntity response = restTemplate.getForEntity(url, String.class); + ResponseEntity response = getRestClient().get() + .uri(URI.create("http://localhost:" + this.server.getPort() + "//")) + .retrieve().toEntity(String.class); // Jetty 10+ rejects empty path segments, see https://github.com/eclipse/jetty.project/issues/6302, // but an application can apply CompactPathRule via RewriteHandler: diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/MultipartHttpHandlerIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/MultipartHttpHandlerIntegrationTests.java index f4bb9be3066..1b6863f69a9 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/MultipartHttpHandlerIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/MultipartHttpHandlerIntegrationTests.java @@ -16,8 +16,6 @@ package org.springframework.http.server.reactive; -import java.net.URI; - import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -27,14 +25,12 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.codec.multipart.FilePart; import org.springframework.http.codec.multipart.FormFieldPart; import org.springframework.http.codec.multipart.Part; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.HttpWebHandlerAdapter; @@ -81,9 +77,9 @@ class MultipartHttpHandlerIntegrationTests extends AbstractHttpHandlerIntegratio parts.add("fooPart", fooPart); parts.add("barPart", barPart); - URI url = URI.create("http://localhost:" + port + "/form-parts"); - ResponseEntity response = new RestTemplate().exchange( - RequestEntity.post(url).contentType(mediaType).body(parts), Void.class); + ResponseEntity response = getRestClient().post().uri("/form-parts") + .contentType(MediaType.MULTIPART_FORM_DATA).body(parts) + .retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/RandomHandlerIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/RandomHandlerIntegrationTests.java index 86a0f157756..34b2c7f7068 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/RandomHandlerIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/RandomHandlerIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.http.server.reactive; -import java.net.URI; import java.util.Random; import org.reactivestreams.Publisher; @@ -25,9 +24,7 @@ import reactor.core.publisher.Mono; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -59,11 +56,7 @@ class RandomHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests // TODO: fix Reactor support - RestTemplate restTemplate = new RestTemplate(); - - byte[] body = randomBytes(); - RequestEntity request = RequestEntity.post(URI.create("http://localhost:" + port)).body(body); - ResponseEntity response = restTemplate.exchange(request, byte[].class); + ResponseEntity response = getRestClient().post().body(randomBytes()).retrieve().toEntity(byte[].class); assertThat(response.getBody()).isNotNull(); assertThat(response.getHeaders().getContentLength()).isEqualTo(RESPONSE_SIZE); diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestIntegrationTests.java index 403e68b8644..fd41f061452 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpRequestIntegrationTests.java @@ -21,9 +21,7 @@ import java.net.URI; import reactor.core.publisher.Mono; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -44,9 +42,7 @@ class ServerHttpRequestIntegrationTests extends AbstractHttpHandlerIntegrationTe void checkUri(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + port + "/foo?param=bar"); - RequestEntity request = RequestEntity.post(url).build(); - ResponseEntity response = new RestTemplate().exchange(request, Void.class); + ResponseEntity response = getRestClient().post().uri("/foo?param=bar").retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpsRequestIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpsRequestIntegrationTests.java index bb0c9befdd9..607057abbad 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpsRequestIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpsRequestIntegrationTests.java @@ -32,10 +32,9 @@ import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; import org.springframework.web.testfixture.http.server.reactive.bootstrap.ReactorHttpsServer; @@ -52,10 +51,7 @@ class ServerHttpsRequestIntegrationTests { private final HttpServer server = new ReactorHttpsServer(); - private int port; - - private RestTemplate restTemplate; - + private RestClient restClient; @BeforeEach void startServer() throws Exception { @@ -63,8 +59,6 @@ class ServerHttpsRequestIntegrationTests { this.server.afterPropertiesSet(); this.server.start(); - // Set dynamically chosen port - this.port = this.server.getPort(); SSLContextBuilder builder = new SSLContextBuilder(); builder.loadTrustMaterial(new TrustSelfSignedStrategy()); @@ -77,7 +71,8 @@ class ServerHttpsRequestIntegrationTests { setConnectionManager(connectionManager).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpclient); - this.restTemplate = new RestTemplate(requestFactory); + this.restClient = RestClient.builder().baseUrl("https://localhost:" + this.server.getPort()) + .requestFactory(requestFactory).build(); } @AfterEach @@ -87,9 +82,7 @@ class ServerHttpsRequestIntegrationTests { @Test void checkUri() { - URI url = URI.create("https://localhost:" + port + "/foo?param=bar"); - RequestEntity request = RequestEntity.post(url).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = this.restClient.post().uri("/foo?param=bar").retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/WriteOnlyHandlerIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/WriteOnlyHandlerIntegrationTests.java index 91cf2b5a12a..ca6bf1702a8 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/WriteOnlyHandlerIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/WriteOnlyHandlerIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.http.server.reactive; -import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Random; @@ -24,9 +23,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -54,12 +51,9 @@ class WriteOnlyHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTes void writeOnly(HttpServer httpServer) throws Exception { startServer(httpServer); - RestTemplate restTemplate = new RestTemplate(); - this.body = randomBytes(); - RequestEntity request = RequestEntity.post(URI.create("http://localhost:" + port)) - .body("".getBytes(StandardCharsets.UTF_8)); - ResponseEntity response = restTemplate.exchange(request, byte[].class); + ResponseEntity response = getRestClient().post().body("".getBytes(StandardCharsets.UTF_8)) + .retrieve().toEntity(byte[].class); assertThat(response.getBody()).isEqualTo(body); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ZeroCopyIntegrationTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ZeroCopyIntegrationTests.java index f290c7c54e0..7c861d8b8a4 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ZeroCopyIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ZeroCopyIntegrationTests.java @@ -17,17 +17,14 @@ package org.springframework.http.server.reactive; import java.io.File; -import java.net.URI; import reactor.core.publisher.Mono; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.ZeroCopyHttpOutputMessage; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; import org.springframework.web.testfixture.http.server.reactive.bootstrap.JettyCoreHttpServer; @@ -59,9 +56,7 @@ class ZeroCopyIntegrationTests extends AbstractHttpHandlerIntegrationTests { startServer(httpServer); - URI url = URI.create("http://localhost:" + port); - RequestEntity request = RequestEntity.get(url).build(); - ResponseEntity response = new RestTemplate().exchange(request, byte[].class); + ResponseEntity response = getRestClient().get().retrieve().toEntity(byte[].class); assertThat(response.hasBody()).isTrue(); assertThat(response.getHeaders().getContentLength()).isEqualTo(springLogoResource.contentLength()); diff --git a/spring-web/src/test/java/org/springframework/web/bind/support/WebRequestDataBinderIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/bind/support/WebRequestDataBinderIntegrationTests.java index 5e1e29f03c4..eb95705e44b 100644 --- a/spring-web/src/test/java/org/springframework/web/bind/support/WebRequestDataBinderIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/bind/support/WebRequestDataBinderIntegrationTests.java @@ -38,11 +38,12 @@ import org.junit.jupiter.api.TestInstance.Lifecycle; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.util.FileSystemUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.context.request.ServletWebRequest; import static org.assertj.core.api.Assertions.assertThat; @@ -58,12 +59,10 @@ class WebRequestDataBinderIntegrationTests { private final PartListServlet partListServlet = new PartListServlet(); - private final RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); + private RestClient restClient; private Server jettyServer; - private String baseUrl; - private Path tempDirectory; @@ -91,7 +90,8 @@ class WebRequestDataBinderIntegrationTests { Connector[] connectors = jettyServer.getConnectors(); NetworkConnector connector = (NetworkConnector) connectors[0]; - baseUrl = "http://localhost:" + connector.getLocalPort(); + this.restClient = RestClient.builder().baseUrl("http://localhost:" + connector.getLocalPort()) + .requestFactory(new HttpComponentsClientHttpRequestFactory()).build(); } @AfterAll @@ -117,7 +117,9 @@ class WebRequestDataBinderIntegrationTests { parts.add("firstPart", firstPart); parts.add("secondPart", "secondValue"); - template.postForLocation(baseUrl + "/parts", parts); + this.restClient.post().uri("/parts") + .contentType(MediaType.MULTIPART_FORM_DATA).body(parts) + .retrieve().toBodilessEntity(); assertThat(bean.getFirstPart()).isNotNull(); assertThat(bean.getSecondPart()).isNotNull(); @@ -134,7 +136,9 @@ class WebRequestDataBinderIntegrationTests { Resource logo = new ClassPathResource("/org/springframework/http/converter/logo.jpg"); parts.add("partList", logo); - template.postForLocation(baseUrl + "/partlist", parts); + this.restClient.post().uri("/partlist") + .contentType(MediaType.MULTIPART_FORM_DATA).body(parts) + .retrieve().toBodilessEntity(); assertThat(bean.getPartList()).isNotNull(); assertThat(bean.getPartList()).hasSize(parts.get("partList").size()); diff --git a/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java b/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java index acf97f5b5c8..76603eb4768 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java @@ -35,6 +35,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpRequest; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; @@ -49,6 +50,7 @@ import org.springframework.util.StreamUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willThrow; import static org.mockito.Mockito.mock; @@ -135,15 +137,15 @@ class RestClientObservationTests { @Test void shouldContributeServerErrorOutcome() throws Exception { - ResponseErrorHandler errorHandler = mock(); - given(errorHandler.hasError(response)).willReturn(true); - this.client = this.client.mutate().defaultStatusHandler(errorHandler).build(); + RestClient.ResponseSpec.ErrorHandler errorHandler = mock(); + this.client = this.client.mutate() + .defaultStatusHandler(HttpStatusCode::is5xxServerError, errorHandler).build(); String url = "https://example.org"; mockSentRequest(GET, url); mockResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR); willThrow(new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR)) - .given(errorHandler).handleError(URI.create(url), GET, response); + .given(errorHandler).handle(any(), any()); assertThatExceptionOfType(HttpServerErrorException.class).isThrownBy(() -> client.get().uri(url).retrieve().toBodilessEntity()); @@ -257,7 +259,8 @@ class RestClientObservationTests { @Test void openScopeWithObservation() throws Exception { this.client = createBuilder().requestInterceptor(new ObservationContextInterceptor(this.observationRegistry)) - .defaultStatusHandler(new ObservationErrorHandler(this.observationRegistry)).build(); + .defaultStatusHandler(HttpStatusCode::is2xxSuccessful, new ObservationErrorHandler(this.observationRegistry)) + .build(); mockSentRequest(GET, "https://example.org"); mockResponseStatus(HttpStatus.OK); mockResponseBody("Hello World", MediaType.TEXT_PLAIN); @@ -334,7 +337,7 @@ class RestClientObservationTests { } } - static class ObservationErrorHandler implements ResponseErrorHandler { + static class ObservationErrorHandler implements RestClient.ResponseSpec.ErrorHandler { final TestObservationRegistry observationRegistry; @@ -343,14 +346,10 @@ class RestClientObservationTests { } @Override - public boolean hasError(ClientHttpResponse response) { - return true; - } - - @Override - public void handleError(URI uri, HttpMethod httpMethod, ClientHttpResponse response) { + public void handle(HttpRequest request, ClientHttpResponse response) throws IOException { assertThat(this.observationRegistry.getCurrentObservationScope()).isNotNull(); } + } } diff --git a/spring-web/src/test/java/org/springframework/web/server/session/WebSessionIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/server/session/WebSessionIntegrationTests.java index 8ef9ee1e3d8..7a8dc21e53c 100644 --- a/spring-web/src/test/java/org/springframework/web/server/session/WebSessionIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/session/WebSessionIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.web.server.session; -import java.net.URI; import java.time.Clock; import java.time.Duration; import java.util.List; @@ -26,10 +25,8 @@ import reactor.core.publisher.Mono; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.web.client.RestTemplate; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebHandler; import org.springframework.web.server.WebSession; @@ -47,8 +44,6 @@ import static org.assertj.core.api.Assertions.assertThat; */ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); - private final DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); private final TestWebHandler handler = new TestWebHandler(); @@ -64,16 +59,14 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { public void createSession(HttpServer httpServer) throws Exception { startServer(httpServer); - RequestEntity request = RequestEntity.get(createUri()).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = getRestClient().get().retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String id = extractSessionId(response.getHeaders()); assertThat(id).isNotNull(); assertThat(this.handler.getSessionRequestCount()).isEqualTo(1); - request = RequestEntity.get(createUri()).header("Cookie", "SESSION=" + id).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().cookie("SESSION", id).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getHeaders().get("Set-Cookie")).isNull(); @@ -85,8 +78,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { startServer(httpServer); // First request: no session yet, new session created - RequestEntity request = RequestEntity.get(createUri()).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = getRestClient().get().retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String id = extractSessionId(response.getHeaders()); @@ -94,8 +86,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { assertThat(this.handler.getSessionRequestCount()).isEqualTo(1); // Second request: same session - request = RequestEntity.get(createUri()).header("Cookie", "SESSION=" + id).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().cookie("SESSION", id).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getHeaders().get("Set-Cookie")).isNull(); @@ -108,8 +99,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { store.setClock(Clock.offset(store.getClock(), Duration.ofMinutes(31))); // Third request: expired session, new session created - request = RequestEntity.get(createUri()).header("Cookie", "SESSION=" + id).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().cookie("SESSION", id).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); id = extractSessionId(response.getHeaders()); @@ -122,8 +112,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { startServer(httpServer); // First request: no session yet, new session created - RequestEntity request = RequestEntity.get(createUri()).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = getRestClient().get().retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String id = extractSessionId(response.getHeaders()); @@ -134,9 +123,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { store.setClock(Clock.offset(store.getClock(), Duration.ofMinutes(31))); // Second request: session expires - URI uri = URI.create("http://localhost:" + this.port + "/?expire"); - request = RequestEntity.get(uri).header("Cookie", "SESSION=" + id).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().uri("/?expire").cookie("SESSION", id).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String value = response.getHeaders().getFirst("Set-Cookie"); @@ -149,8 +136,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { startServer(httpServer); // First request: no session yet, new session created - RequestEntity request = RequestEntity.get(createUri()).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = getRestClient().get().retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String oldId = extractSessionId(response.getHeaders()); @@ -158,9 +144,7 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { assertThat(this.handler.getSessionRequestCount()).isEqualTo(1); // Second request: session id changes - URI uri = URI.create("http://localhost:" + this.port + "/?changeId"); - request = RequestEntity.get(uri).header("Cookie", "SESSION=" + oldId).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().uri("/?changeId").cookie("SESSION", oldId).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String newId = extractSessionId(response.getHeaders()); @@ -174,17 +158,14 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { startServer(httpServer); // First request: no session yet, new session created - RequestEntity request = RequestEntity.get(createUri()).build(); - ResponseEntity response = this.restTemplate.exchange(request, Void.class); + ResponseEntity response = getRestClient().get().retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String id = extractSessionId(response.getHeaders()); assertThat(id).isNotNull(); // Second request: invalidates session - URI uri = URI.create("http://localhost:" + this.port + "/?invalidate"); - request = RequestEntity.get(uri).header("Cookie", "SESSION=" + id).build(); - response = this.restTemplate.exchange(request, Void.class); + response = getRestClient().get().uri("/?invalidate").cookie("SESSION", id).retrieve().toBodilessEntity(); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); String value = response.getHeaders().getFirst("Set-Cookie"); @@ -205,10 +186,6 @@ class WebSessionIntegrationTests extends AbstractHttpHandlerIntegrationTests { return null; } - private URI createUri() { - return URI.create("http://localhost:" + this.port + "/"); - } - private static class TestWebHandler implements WebHandler { diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/bootstrap/AbstractHttpHandlerIntegrationTests.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/bootstrap/AbstractHttpHandlerIntegrationTests.java index 6145f1ababb..519d0ea25c0 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/bootstrap/AbstractHttpHandlerIntegrationTests.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/http/server/reactive/bootstrap/AbstractHttpHandlerIntegrationTests.java @@ -36,6 +36,7 @@ import reactor.core.publisher.Flux; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.util.StringUtils; import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestClient; import static org.junit.jupiter.params.provider.Arguments.argumentSet; @@ -75,6 +76,8 @@ public abstract class AbstractHttpHandlerIntegrationTests { protected int port; + private RestClient restClient; + protected void startServer(HttpServer httpServer) throws Exception { this.server = httpServer; @@ -84,6 +87,7 @@ public abstract class AbstractHttpHandlerIntegrationTests { // Set dynamically chosen port this.port = this.server.getPort(); + onServerStart(this.server.getPort()); } @AfterEach @@ -97,6 +101,18 @@ public abstract class AbstractHttpHandlerIntegrationTests { protected abstract HttpHandler createHttpHandler(); + protected void onServerStart(int port) { + this.restClient = initRestClient(RestClient.builder().baseUrl("http://localhost:" + this.port)); + } + + protected RestClient initRestClient(RestClient.Builder builder) { + return builder.build(); + } + + protected RestClient getRestClient() { + return this.restClient; + } + /** * Return an interval stream of N number of ticks and buffer the emissions diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DispatcherHandlerIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DispatcherHandlerIntegrationTests.java index e926e85169a..3f252629304 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DispatcherHandlerIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DispatcherHandlerIntegrationTests.java @@ -29,7 +29,6 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -37,7 +36,6 @@ import org.springframework.http.server.reactive.HttpHandler; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.DispatcherHandler; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.reactive.config.EnableWebFlux; @@ -60,8 +58,6 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r */ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); - @Override protected HttpHandler createHttpHandler() { @@ -76,8 +72,8 @@ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTe void mono(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - this.restTemplate.getForEntity("http://localhost:" + this.port + "/mono", Person.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + this.port + "/mono") + .retrieve().toEntity(Person.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody().getName()).isEqualTo("John"); @@ -87,10 +83,8 @@ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTe void flux(HttpServer httpServer) throws Exception { startServer(httpServer); - ParameterizedTypeReference> reference = new ParameterizedTypeReference<>() {}; - ResponseEntity> result = - this.restTemplate - .exchange("http://localhost:" + this.port + "/flux", HttpMethod.GET, null, reference); + ResponseEntity> result = getRestClient().get().uri("http://localhost:" + this.port + "/flux") + .retrieve().toEntity(new ParameterizedTypeReference<>() {}); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); List body = result.getBody(); @@ -103,8 +97,8 @@ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTe void controller(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - this.restTemplate.getForEntity("http://localhost:" + this.port + "/controller", Person.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + this.port + "/controller") + .retrieve().toEntity(Person.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody().getName()).isEqualTo("John"); @@ -114,9 +108,8 @@ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTe void attributes(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - this.restTemplate - .getForEntity("http://localhost:" + this.port + "/attributes/bar", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + this.port + "/attributes/bar") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); } @@ -125,8 +118,8 @@ class DispatcherHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTe void nested(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = this.restTemplate - .getForEntity("http://localhost:" + this.port + "/foo/bar", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + this.port + "/foo/bar") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/NestedRouteIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/NestedRouteIntegrationTests.java index b725f902fdf..9f347f7ea71 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/NestedRouteIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/NestedRouteIntegrationTests.java @@ -25,7 +25,6 @@ import reactor.core.publisher.Mono; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; import org.springframework.web.util.pattern.PathPattern; @@ -42,8 +41,6 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r */ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); - @Override protected RouterFunction routerFunction() { @@ -64,8 +61,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void bar(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/foo/bar", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + port + "/foo/bar") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("/foo/bar"); @@ -75,8 +72,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void baz(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/foo/baz", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + port + "/foo/baz") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("/foo/baz"); @@ -86,8 +83,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void variables(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/1/2/3", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + port + "/1/2/3") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); String body = result.getBody(); @@ -102,8 +99,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void parentVariables(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/1/bar", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + port + "/1/bar") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("/{foo}/bar\n{foo=1}"); @@ -115,8 +112,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void removeFailedNestedPathVariables(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/qux/quux", String.class); + ResponseEntity result = getRestClient().get().uri("http://localhost:" + port + "/qux/quux") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("/{qux}/quux\n{qux=qux}"); @@ -128,8 +125,8 @@ class NestedRouteIntegrationTests extends AbstractRouterFunctionIntegrationTests void removeFailedPathVariablesAnd(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.postForEntity("http://localhost:" + port + "/qux/quux", "", String.class); + ResponseEntity result = getRestClient().post().uri("http://localhost:" + port + "/qux/quux") + .retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isEqualTo("{}"); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PublisherHandlerFunctionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PublisherHandlerFunctionIntegrationTests.java index e5460e670d6..5d053c8957d 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PublisherHandlerFunctionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PublisherHandlerFunctionIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.web.reactive.function.server; -import java.net.URI; import java.util.List; import java.util.Objects; @@ -25,11 +24,8 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; import static org.assertj.core.api.Assertions.assertThat; @@ -44,8 +40,6 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r */ class PublisherHandlerFunctionIntegrationTests extends AbstractRouterFunctionIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); - @Override protected RouterFunction routerFunction() { @@ -55,13 +49,11 @@ class PublisherHandlerFunctionIntegrationTests extends AbstractRouterFunctionInt .and(route(GET("/flux"), personHandler::flux)); } - @ParameterizedHttpServerTest void mono(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + super.port + "/mono", Person.class); + ResponseEntity result = getRestClient().get().uri("/mono").retrieve().toEntity(Person.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody().getName()).isEqualTo("John"); @@ -71,9 +63,8 @@ class PublisherHandlerFunctionIntegrationTests extends AbstractRouterFunctionInt void flux(HttpServer httpServer) throws Exception { startServer(httpServer); - ParameterizedTypeReference> reference = new ParameterizedTypeReference<>() {}; - ResponseEntity> result = - restTemplate.exchange("http://localhost:" + super.port + "/flux", HttpMethod.GET, null, reference); + ResponseEntity> result = getRestClient().get().uri("/flux").retrieve() + .toEntity(new ParameterizedTypeReference<>() {}); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); List body = result.getBody(); @@ -86,10 +77,8 @@ class PublisherHandlerFunctionIntegrationTests extends AbstractRouterFunctionInt void postMono(HttpServer httpServer) throws Exception { startServer(httpServer); - URI uri = URI.create("http://localhost:" + super.port + "/mono"); Person person = new Person("Jack"); - RequestEntity requestEntity = RequestEntity.post(uri).body(person); - ResponseEntity result = restTemplate.exchange(requestEntity, Person.class); + ResponseEntity result = getRestClient().post().uri("/mono").body(person).retrieve().toEntity(Person.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody().getName()).isEqualTo("Jack"); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RenderingResponseIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RenderingResponseIntegrationTests.java index 7c82bb014c5..fa7ffe6cd9d 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RenderingResponseIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RenderingResponseIntegrationTests.java @@ -31,7 +31,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.util.CollectionUtils; -import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.result.view.View; import org.springframework.web.reactive.result.view.ViewResolver; import org.springframework.web.server.ServerWebExchange; @@ -48,8 +47,6 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r */ class RenderingResponseIntegrationTests extends AbstractRouterFunctionIntegrationTests { - private final RestTemplate restTemplate = new RestTemplate(); - @Override protected RouterFunction routerFunction() { @@ -76,8 +73,7 @@ class RenderingResponseIntegrationTests extends AbstractRouterFunctionIntegratio void normal(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/normal", String.class); + ResponseEntity result = getRestClient().get().uri("/normal").retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); Map body = parseBody(result.getBody()); @@ -90,8 +86,7 @@ class RenderingResponseIntegrationTests extends AbstractRouterFunctionIntegratio void filter(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity result = - restTemplate.getForEntity("http://localhost:" + port + "/filter", String.class); + ResponseEntity result = getRestClient().get().uri("/filter").retrieve().toEntity(String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); Map body = parseBody(result.getBody()); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java index 29d2dcab8f1..a3d8cdc20b1 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.web.reactive.result; -import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -31,11 +30,9 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.HttpStatus; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.DispatcherHandler; import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping; import org.springframework.web.server.WebHandler; @@ -54,6 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegrationTests { + @Override protected HttpHandler createHttpHandler() { AnnotationConfigApplicationContext wac = new AnnotationConfigApplicationContext(WebConfig.class); @@ -63,15 +61,12 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra .build(); } - @ParameterizedHttpServerTest void requestToFooHandler(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + this.port + "/foo"); - RequestEntity request = RequestEntity.get(url).build(); - @SuppressWarnings("resource") - ResponseEntity response = new RestTemplate().exchange(request, byte[].class); + ResponseEntity response = getRestClient().get().uri("http://localhost:" + this.port + "/foo") + .retrieve().toEntity(byte[].class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody()).isEqualTo("foo".getBytes(StandardCharsets.UTF_8)); @@ -81,10 +76,8 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra public void requestToBarHandler(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + this.port + "/bar"); - RequestEntity request = RequestEntity.get(url).build(); - @SuppressWarnings("resource") - ResponseEntity response = new RestTemplate().exchange(request, byte[].class); + ResponseEntity response = getRestClient().get().uri("http://localhost:" + this.port + "/bar") + .retrieve().toEntity(byte[].class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody()).isEqualTo("bar".getBytes(StandardCharsets.UTF_8)); @@ -94,24 +87,19 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra void requestToHeaderSettingHandler(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + this.port + "/header"); - RequestEntity request = RequestEntity.get(url).build(); - @SuppressWarnings("resource") - ResponseEntity response = new RestTemplate().exchange(request, byte[].class); + ResponseEntity response = getRestClient().get().uri("http://localhost:" + this.port + "/header") + .retrieve().toEntity(byte[].class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getHeaders().getFirst("foo")).isEqualTo("bar"); } @ParameterizedHttpServerTest - @SuppressWarnings("resource") void handlerNotFound(HttpServer httpServer) throws Exception { startServer(httpServer); - URI url = URI.create("http://localhost:" + this.port + "/oops"); - RequestEntity request = RequestEntity.get(url).build(); try { - new RestTemplate().exchange(request, byte[].class); + getRestClient().get().uri("http://localhost:" + this.port + "/oops").retrieve().toEntity(byte[].class); } catch (HttpClientErrorException ex) { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/AbstractRequestMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/AbstractRequestMappingIntegrationTests.java index 145445da8c9..f6af24d5099 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/AbstractRequestMappingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/AbstractRequestMappingIntegrationTests.java @@ -17,18 +17,14 @@ package org.springframework.web.reactive.result.method.annotation; import java.net.URI; -import java.util.Collections; -import java.util.List; -import java.util.Map; import org.springframework.context.ApplicationContext; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpHandlerIntegrationTests; @@ -39,102 +35,74 @@ import org.springframework.web.testfixture.http.server.reactive.bootstrap.Abstra */ public abstract class AbstractRequestMappingIntegrationTests extends AbstractHttpHandlerIntegrationTests { - private RestTemplate restTemplate = new RestTemplate(); - private ApplicationContext applicationContext; @Override protected HttpHandler createHttpHandler() { - this.restTemplate = initRestTemplate(); this.applicationContext = initApplicationContext(); return WebHttpHandlerBuilder.applicationContext(this.applicationContext).build(); } protected abstract ApplicationContext initApplicationContext(); - protected RestTemplate initRestTemplate() { - return new RestTemplate(); - } - protected ApplicationContext getApplicationContext() { return this.applicationContext; } - protected RestTemplate getRestTemplate() { - return this.restTemplate; - } ResponseEntity performGet(String url, MediaType out, Class type) { - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(out)); - return getRestTemplate().exchange(prepareGet(url, headers), type); + return getRestClient() + .get().uri(URI.create(url)).accept(out) + .retrieve() + .toEntity(type); } ResponseEntity performGet(String url, HttpHeaders headers, Class type) { - return getRestTemplate().exchange(prepareGet(url, headers), type); + return getRestClient() + .get().uri(URI.create(url)).headers(httpHeaders -> httpHeaders.putAll(headers)) + .retrieve() + .toEntity(type); } ResponseEntity performGet(String url, MediaType out, ParameterizedTypeReference type) { - HttpHeaders headers = new HttpHeaders(); - headers.setAccept(Collections.singletonList(out)); - return this.restTemplate.exchange(prepareGet(url, headers), type); + return getRestClient() + .get().uri(URI.create(url)).accept(out) + .retrieve() + .toEntity(type); } ResponseEntity performOptions(String url, HttpHeaders headers, Class type) { - return getRestTemplate().exchange(prepareOptions(url, headers), type); + return getRestClient() + .options().uri(URI.create(url)).headers(httpHeaders -> httpHeaders.putAll(headers)) + .retrieve() + .toEntity(type); } ResponseEntity performPost(String url, MediaType in, Object body, MediaType out, Class type) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(in); - if (out != null) { - headers.setAccept(Collections.singletonList(out)); + RestClient.RequestBodySpec bodySpec = getRestClient() + .post().uri(URI.create(url)).accept(out).contentType(in); + if (body != null) { + bodySpec.body(body); } - return getRestTemplate().exchange(preparePost(url, headers, body), type); + return bodySpec.retrieve().toEntity(type); } ResponseEntity performPost(String url, HttpHeaders headers, Object body, Class type) { - return getRestTemplate().exchange(preparePost(url, headers, body), type); + RestClient.RequestBodySpec bodySpec = getRestClient() + .post().uri(URI.create(url)).headers(httpHeaders -> httpHeaders.putAll(headers)); + if (body != null) { + bodySpec.body(body); + } + return bodySpec.retrieve().toEntity(type); } ResponseEntity performPost(String url, MediaType in, Object body, MediaType out, ParameterizedTypeReference type) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(in); - if (out != null) { - headers.setAccept(Collections.singletonList(out)); - } - return getRestTemplate().exchange(preparePost(url, headers, body), type); - } - - private RequestEntity prepareGet(String url, HttpHeaders headers) { - URI uri = URI.create("http://localhost:" + this.port + url); - RequestEntity.HeadersBuilder builder = RequestEntity.get(uri); - addHeaders(builder, headers); - return builder.build(); - } - - private RequestEntity prepareOptions(String url, HttpHeaders headers) { - URI uri = URI.create("http://localhost:" + this.port + url); - RequestEntity.HeadersBuilder builder = RequestEntity.options(uri); - addHeaders(builder, headers); - return builder.build(); - } - - private void addHeaders(RequestEntity.HeadersBuilder builder, HttpHeaders headers) { - for (Map.Entry> entry : headers.headerSet()) { - for (String value : entry.getValue()) { - builder.header(entry.getKey(), value); - } - } - } - - private RequestEntity preparePost(String url, HttpHeaders headers, Object body) { - URI uri = URI.create("http://localhost:" + this.port + url); - RequestEntity.BodyBuilder builder = RequestEntity.post(uri); - addHeaders(builder, headers); - return builder.body(body); + return getRestClient() + .post().uri(URI.create(url)).accept(out).contentType(in).body(body) + .retrieve() + .toEntity(type); } } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java index 882353a866d..a2ed7257faf 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ContextPathIntegrationTests.java @@ -30,7 +30,7 @@ import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpServer; @@ -73,16 +73,13 @@ class ContextPathIntegrationTests { server.start(); try { - RestTemplate restTemplate = new RestTemplate(); - String actual; + RestClient restClient = RestClient.create("http://localhost:" + server.getPort()); - String url = "http://localhost:" + server.getPort() + "/webApp1/test"; - actual = restTemplate.getForObject(url, String.class); - assertThat(actual).isEqualTo("Tested in /webApp1"); + assertThat(restClient.get().uri("/webApp1/test").retrieve().body(String.class)) + .isEqualTo("Tested in /webApp1"); - url = "http://localhost:" + server.getPort() + "/webApp2/test"; - actual = restTemplate.getForObject(url, String.class); - assertThat(actual).isEqualTo("Tested in /webApp2"); + assertThat(restClient.get().uri("/webApp2/test").retrieve().body(String.class)) + .isEqualTo("Tested in /webApp2"); } finally { server.stop(); @@ -104,9 +101,9 @@ class ContextPathIntegrationTests { server.start(); try { - String url = "http://localhost:" + server.getPort() + "/app/api/test"; - String actual = new RestTemplate().getForObject(url, String.class); - assertThat(actual).isEqualTo("Tested in /app/api"); + RestClient restClient = RestClient.create("http://localhost:" + server.getPort()); + assertThat(restClient.get().uri("/app/api/test").retrieve().body(String.class)) + .isEqualTo("Tested in /app/api"); } finally { server.stop(); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/CrossOriginAnnotationIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/CrossOriginAnnotationIntegrationTests.java index 6f44d56eb41..c4e5f6f391b 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/CrossOriginAnnotationIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/CrossOriginAnnotationIntegrationTests.java @@ -35,7 +35,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -73,10 +73,11 @@ class CrossOriginAnnotationIntegrationTests extends AbstractRequestMappingIntegr return context; } + @Override - protected RestTemplate initRestTemplate() { + protected RestClient initRestClient(RestClient.Builder builder) { // JDK default HTTP client disallowed headers like Origin - return new RestTemplate(new HttpComponentsClientHttpRequestFactory()); + return builder.requestFactory(new HttpComponentsClientHttpRequestFactory()).build(); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/GlobalCorsConfigIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/GlobalCorsConfigIntegrationTests.java index f8ff99ddda3..7098d7ffc3b 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/GlobalCorsConfigIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/GlobalCorsConfigIntegrationTests.java @@ -29,7 +29,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.config.CorsRegistry; import org.springframework.web.reactive.config.WebFluxConfigurationSupport; import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer; @@ -63,9 +63,9 @@ class GlobalCorsConfigIntegrationTests extends AbstractRequestMappingIntegration } @Override - protected RestTemplate initRestTemplate() { + protected RestClient initRestClient(RestClient.Builder builder) { // JDK default HTTP client disallowed headers like Origin - return new RestTemplate(new HttpComponentsClientHttpRequestFactory()); + return builder.requestFactory(new HttpComponentsClientHttpRequestFactory()).build(); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java index 61f86520e9c..e50be4a9942 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.web.reactive.result.method.annotation; -import java.net.URI; import java.time.Duration; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; @@ -31,7 +30,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.http.HttpHeaders; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.bind.annotation.GetMapping; @@ -75,11 +73,8 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe void emptyMapping(HttpServer httpServer) throws Exception { startServer(httpServer); - String url = "http://localhost:" + this.port; - assertThat(getRestTemplate().getForObject(url, String.class)).isEqualTo("root"); - - url += "/"; - assertThat(getRestTemplate().getForObject(url, String.class)).isEqualTo("root"); + assertThat(getRestClient().get().retrieve().body(String.class)).isEqualTo("root"); + assertThat(getRestClient().get().uri("/").retrieve().body(String.class)).isEqualTo("root"); assertThat(getApplicationContext().getBean(TestExecutor.class).invocationCount.get()).isEqualTo(4); assertThat(getApplicationContext().getBean(TestPredicate.class).invocationCount.get()).isEqualTo(4); @@ -89,9 +84,8 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe void httpHead(HttpServer httpServer) throws Exception { startServer(httpServer); - String url = "http://localhost:" + this.port + "/text"; - HttpHeaders headers = getRestTemplate().headForHeaders(url); - String contentType = headers.getFirst("Content-Type"); + ResponseEntity response = getRestClient().head().uri("/text").retrieve().toBodilessEntity(); + String contentType = response.getHeaders().getFirst("Content-Type"); assertThat(contentType).isNotNull(); } @@ -102,11 +96,11 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe // One integration test to verify triggering of Forwarded header support. // More fine-grained tests in ForwardedHeaderTransformerTests. - RequestEntity request = RequestEntity - .get(URI.create("http://localhost:" + this.port + "/uri")) + ResponseEntity entity = getRestClient().get().uri("/uri") .header("Forwarded", "host=84.198.58.199;proto=https") - .build(); - ResponseEntity entity = getRestTemplate().exchange(request, String.class); + .retrieve() + .toEntity(String.class); + assertThat(entity.getBody()).isEqualTo("https://84.198.58.199/uri"); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java index 9a99bdb8857..b76ea67df10 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java @@ -366,7 +366,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost("/person-create/publisher", JSON, - asList(new Person("Robert"), new Person("Marie")), null, Void.class); + asList(new Person("Robert"), new Person("Marie")), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -377,7 +377,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); People people = new People(new Person("Robert"), new Person("Marie")); - ResponseEntity response = performPost("/person-create/publisher", APPLICATION_XML, people, null, Void.class); + ResponseEntity response = performPost("/person-create/publisher", APPLICATION_XML, people, MediaType.ALL, Void.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -388,7 +388,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost( - "/person-create/mono", JSON, new Person("Robert"), null, Void.class); + "/person-create/mono", JSON, new Person("Robert"), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(1); @@ -399,7 +399,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost( - "/person-create/single", JSON, new Person("Robert"), null, Void.class); + "/person-create/single", JSON, new Person("Robert"), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(1); @@ -410,7 +410,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost("/person-create/flux", JSON, - asList(new Person("Robert"), new Person("Marie")), null, Void.class); + asList(new Person("Robert"), new Person("Marie")), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -421,7 +421,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); People people = new People(new Person("Robert"), new Person("Marie")); - ResponseEntity response = performPost("/person-create/flux", APPLICATION_XML, people, null, Void.class); + ResponseEntity response = performPost("/person-create/flux", APPLICATION_XML, people, MediaType.ALL, Void.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -432,7 +432,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost("/person-create/observable", JSON, - asList(new Person("Robert"), new Person("Marie")), null, Void.class); + asList(new Person("Robert"), new Person("Marie")), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -443,7 +443,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); People people = new People(new Person("Robert"), new Person("Marie")); - ResponseEntity response = performPost("/person-create/observable", APPLICATION_XML, people, null, Void.class); + ResponseEntity response = performPost("/person-create/observable", APPLICATION_XML, people, MediaType.ALL, Void.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -454,7 +454,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); ResponseEntity entity = performPost("/person-create/flowable", JSON, - asList(new Person("Robert"), new Person("Marie")), null, Void.class); + asList(new Person("Robert"), new Person("Marie")), MediaType.ALL, Void.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -465,7 +465,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap startServer(httpServer); People people = new People(new Person("Robert"), new Person("Marie")); - ResponseEntity response = performPost("/person-create/flowable", APPLICATION_XML, people, null, Void.class); + ResponseEntity response = performPost("/person-create/flowable", APPLICATION_XML, people, MediaType.ALL, Void.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(getApplicationContext().getBean(PersonCreateController.class).persons).hasSize(2); @@ -474,7 +474,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap @ParameterizedHttpServerTest // gh-23791 void personCreateViaDefaultMethodWithGenerics(HttpServer httpServer) throws Exception { startServer(httpServer); - ResponseEntity entity = performPost("/23791", JSON, new Person("Robert"), null, String.class); + ResponseEntity entity = performPost("/23791", JSON, new Person("Robert"), MediaType.ALL, String.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(entity.getBody()).isEqualTo("Person"); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingVersionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingVersionIntegrationTests.java index 032007d7e5d..cc228770a30 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingVersionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingVersionIntegrationTests.java @@ -22,7 +22,6 @@ import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.accept.SemanticApiVersionParser.Version; import org.springframework.web.bind.annotation.GetMapping; @@ -77,18 +76,15 @@ class RequestMappingVersionIntegrationTests extends AbstractRequestMappingIntegr @Test // gh-36059 void staticResourceWithInvalidApiVersion() throws Exception { startServer(new TomcatHttpServer()); - - String url = "http://localhost:" + this.port + "/cp/test/foo.css"; - RequestEntity requestEntity = RequestEntity.get(url).header("API-Version", "Invalid").build(); - ResponseEntity entity = getRestTemplate().exchange(requestEntity, String.class); + ResponseEntity entity = getRestClient().get().uri("/cp/test/foo.css") + .header("API-Version", "Invalid").retrieve().toEntity(String.class); assertThat(entity.getBody()).isEqualTo("h1 { color:red; }"); } private ResponseEntity exchangeWithVersion(String version) { - String url = "http://localhost:" + this.port; - RequestEntity requestEntity = RequestEntity.get(url).header("API-Version", version).build(); - return getRestTemplate().exchange(requestEntity, String.class); + return getRestClient().get().uri("/").header("API-Version", version) + .retrieve().toEntity(String.class); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingViewResolutionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingViewResolutionIntegrationTests.java index c26df78279f..0e483de7ac2 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingViewResolutionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingViewResolutionIntegrationTests.java @@ -18,7 +18,6 @@ package org.springframework.web.reactive.result.method.annotation; import java.io.IOException; import java.net.HttpURLConnection; -import java.net.URI; import java.util.Optional; import org.springframework.context.ApplicationContext; @@ -28,13 +27,12 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.reactive.config.ViewResolverRegistry; import org.springframework.web.reactive.config.WebFluxConfigurer; @@ -69,9 +67,9 @@ class RequestMappingViewResolutionIntegrationTests extends AbstractRequestMappin void etagCheckWithNotModifiedResponse(HttpServer httpServer) throws Exception { startServer(httpServer); - URI uri = URI.create("http://localhost:" + this.port + "/html"); - RequestEntity request = RequestEntity.get(uri).ifNoneMatch("\"deadb33f8badf00d\"").build(); - ResponseEntity response = getRestTemplate().exchange(request, String.class); + ResponseEntity response = getRestClient().get().uri("/html") + .headers(headers -> headers.setIfNoneMatch("\"deadb33f8badf00d\"")) + .retrieve().toEntity(String.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_MODIFIED); assertThat(response.getBody()).isNull(); @@ -89,9 +87,10 @@ class RequestMappingViewResolutionIntegrationTests extends AbstractRequestMappin } }; - URI uri = URI.create("http://localhost:" + this.port + "/redirect"); - RequestEntity request = RequestEntity.get(uri).accept(MediaType.ALL).build(); - ResponseEntity response = new RestTemplate(factory).exchange(request, Void.class); + RestClient restClient = RestClient.builder().requestFactory(factory) + .baseUrl("http://localhost:" + this.port).build(); + ResponseEntity response = restClient.get().uri("/redirect").accept(MediaType.ALL) + .retrieve().toEntity(Void.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.SEE_OTHER); assertThat(response.getHeaders().getLocation().toString()).isEqualTo("/"); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/SseIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/SseIntegrationTests.java index 4d4d6f8cebc..dd67c1d2f19 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/SseIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/SseIntegrationTests.java @@ -76,7 +76,6 @@ class SseIntegrationTests extends AbstractHttpHandlerIntegrationTests { private void startServer(HttpServer httpServer, ClientHttpConnector connector) throws Exception { super.startServer(httpServer); - this.webClient = WebClient .builder() .clientConnector(connector) diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartIntegrationTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartIntegrationTests.java index 0a679f81d52..fa7eb4bebec 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartIntegrationTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartIntegrationTests.java @@ -44,7 +44,6 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.ByteArrayHttpMessageConverter; @@ -59,7 +58,7 @@ import org.springframework.util.MimeTypeUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClient; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartResolver; @@ -80,14 +79,13 @@ import static org.springframework.web.bind.annotation.RequestMethod.POST; */ class RequestPartIntegrationTests { - private RestTemplate restTemplate; - private static Server server; private static String baseUrl; private static Path tempDirectory; + private RestClient restClient; @BeforeAll static void startServer() throws Exception { @@ -135,11 +133,13 @@ class RequestPartIntegrationTests { converters.add(new ResourceHttpMessageConverter()); converters.add(new JacksonJsonHttpMessageConverter()); - AllEncompassingFormHttpMessageConverter converter = new AllEncompassingFormHttpMessageConverter(); - converter.setPartConverters(converters); + AllEncompassingFormHttpMessageConverter formConverter = new AllEncompassingFormHttpMessageConverter(); + formConverter.setPartConverters(converters); - restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); - restTemplate.setMessageConverters(Collections.singletonList(converter)); + this.restClient = RestClient.builder().baseUrl(baseUrl) + .requestFactory(new HttpComponentsClientHttpRequestFactory()) + .configureMessageConverters(clientBuilder -> clientBuilder.addCustomConverter(formConverter)) + .build(); } @@ -163,16 +163,19 @@ class RequestPartIntegrationTests { "content\r\n" + "--" + boundaryText + "--\r\n "; - RequestEntity requestEntity = - RequestEntity.post(URI.create(baseUrl + "/standard-resolver/spr13319")) - .contentType(new MediaType(MediaType.MULTIPART_FORM_DATA, params)) - .body(content.getBytes(StandardCharsets.US_ASCII)); + ByteArrayHttpMessageConverter byteArrayConverter = new ByteArrayHttpMessageConverter(); + byteArrayConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.MULTIPART_FORM_DATA)); + this.restClient = RestClient.builder().baseUrl(baseUrl) + .requestFactory(new HttpComponentsClientHttpRequestFactory()) + .configureMessageConverters(clientBuilder -> clientBuilder.addCustomConverter(byteArrayConverter)) + .build(); - ByteArrayHttpMessageConverter converter = new ByteArrayHttpMessageConverter(); - converter.setSupportedMediaTypes(Collections.singletonList(MediaType.MULTIPART_FORM_DATA)); - this.restTemplate.setMessageConverters(Collections.singletonList(converter)); + ResponseEntity responseEntity = this.restClient.post().uri("/standard-resolver/spr13319") + .contentType(new MediaType(MediaType.MULTIPART_FORM_DATA, params)) + .body(content.getBytes(StandardCharsets.US_ASCII)) + .retrieve() + .toBodilessEntity(); - ResponseEntity responseEntity = restTemplate.exchange(requestEntity, Void.class); assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); } @@ -186,8 +189,9 @@ class RequestPartIntegrationTests { headers.setContentType(new MediaType("application", "octet-stream", StandardCharsets.ISO_8859_1)); parts.add("iso-8859-1-data", new HttpEntity<>(new byte[] {(byte) 0xC4}, headers)); // SPR-13096 - URI location = restTemplate.postForLocation(url, parts); - assertThat(location.toString()).isEqualTo(("http://localhost:8080/test/" + basename + "/logo.jpg")); + ResponseEntity response = this.restClient.post().uri(url).contentType(MediaType.MULTIPART_FORM_DATA) + .body(parts).retrieve().toBodilessEntity(); + assertThat(response.getHeaders().getLocation().toString()).isEqualTo(("http://localhost:8080/test/" + basename + "/logo.jpg")); }