MockMvcHttpConnector supports RequestPostProcessor's

Closes gh-31298
This commit is contained in:
rstoyanchev
2023-09-22 14:51:53 +01:00
parent 0f6b018e97
commit af7fe013b6
5 changed files with 121 additions and 18 deletions

View File

@@ -17,11 +17,17 @@
package org.springframework.test.web.servlet.samples.client.standalone;
import java.security.Principal;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpHeaders;
import org.springframework.http.client.reactive.ClientHttpConnector;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.reactive.server.WebTestClientConfigurer;
import org.springframework.test.web.servlet.client.MockMvcHttpConnector;
import org.springframework.test.web.servlet.client.MockMvcWebTestClient;
import org.springframework.test.web.servlet.request.RequestPostProcessor;
import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder;
@@ -30,6 +36,7 @@ import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
import static org.mockito.Mockito.mock;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -50,16 +57,16 @@ public class FrameworkExtensionTests {
@Test
public void fooHeader() {
this.client.get().uri("/")
.header("Foo", "a=b")
this.client.mutateWith(headers().foo("a=b"))
.get().uri("/")
.exchange()
.expectBody(String.class).isEqualTo("Foo");
}
@Test
public void barHeader() {
this.client.get().uri("/")
.header("Bar", "a=b")
this.client.mutateWith(headers().bar("a=b"))
.get().uri("/")
.exchange()
.expectBody(String.class).isEqualTo("Bar");
}
@@ -68,6 +75,68 @@ public class FrameworkExtensionTests {
return new TestMockMvcConfigurer();
}
private static TestWebTestClientConfigurer headers() {
return new TestWebTestClientConfigurer();
}
/**
* Test WebTestClientConfigurer that re-creates the MockMvcHttpConnector
* with a {@code TestRequestPostProcessor}.
*/
private static class TestWebTestClientConfigurer implements WebTestClientConfigurer {
private final TestRequestPostProcessor requestPostProcessor = new TestRequestPostProcessor();
public TestWebTestClientConfigurer foo(String value) {
this.requestPostProcessor.foo(value);
return this;
}
public TestWebTestClientConfigurer bar(String value) {
this.requestPostProcessor.bar(value);
return this;
}
@Override
public void afterConfigurerAdded(
WebTestClient.Builder builder, WebHttpHandlerBuilder httpHandlerBuilder,
ClientHttpConnector connector) {
if (connector instanceof MockMvcHttpConnector mockMvcConnector) {
builder.clientConnector(mockMvcConnector.with(List.of(this.requestPostProcessor)));
}
}
}
/**
* Test {@code RequestPostProcessor} for custom headers.
*/
private static class TestRequestPostProcessor implements RequestPostProcessor {
private final HttpHeaders headers = new HttpHeaders();
public TestRequestPostProcessor foo(String value) {
this.headers.add("Foo", value);
return this;
}
public TestRequestPostProcessor bar(String value) {
this.headers.add("Bar", value);
return this;
}
@Override
public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
for (String headerName : this.headers.keySet()) {
request.addHeader(headerName, this.headers.get(headerName));
}
return request;
}
}
/**
* Test {@code MockMvcConfigurer}.
@@ -80,8 +149,9 @@ public class FrameworkExtensionTests {
}
@Override
public RequestPostProcessor beforeMockMvcCreated(ConfigurableMockMvcBuilder<?> builder,
WebApplicationContext context) {
public RequestPostProcessor beforeMockMvcCreated(
ConfigurableMockMvcBuilder<?> builder, WebApplicationContext context) {
return request -> {
request.setUserPrincipal(mock());
return request;

View File

@@ -18,7 +18,6 @@ package org.springframework.test.web.servlet.samples.standalone;
import java.security.Principal;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpHeaders;
@@ -53,14 +52,9 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standal
*/
public class FrameworkExtensionTests {
private MockMvc mockMvc;
private final MockMvc mockMvc = standaloneSetup(new SampleController()).apply(defaultSetup()).build();
@BeforeEach
public void setup() {
this.mockMvc = standaloneSetup(new SampleController()).apply(defaultSetup()).build();
}
@Test
public void fooHeader() throws Exception {
this.mockMvc.perform(get("/").with(headers().foo("a=b"))).andExpect(content().string("Foo"));
@@ -81,7 +75,7 @@ public class FrameworkExtensionTests {
/**
* Test {@code RequestPostProcessor}.
* Test {@code RequestPostProcessor} for custom headers.
*/
private static class TestRequestPostProcessor implements RequestPostProcessor {
@@ -119,8 +113,9 @@ public class FrameworkExtensionTests {
}
@Override
public RequestPostProcessor beforeMockMvcCreated(ConfigurableMockMvcBuilder<?> builder,
WebApplicationContext context) {
public RequestPostProcessor beforeMockMvcCreated(
ConfigurableMockMvcBuilder<?> builder, WebApplicationContext context) {
return request -> {
request.setUserPrincipal(mock());
return request;