Skip to content

Commit 24ca8cc

Browse files
committed
WebTestClient.mutate() should not impact future .mutate() invocations
Issue: SPR-16059
1 parent 6e71664 commit 24ca8cc

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ class DefaultWebTestClient implements WebTestClient {
6666

6767
private final Duration timeout;
6868

69-
private final WebTestClient.Builder builder;
69+
private final DefaultWebTestClientBuilder builder;
7070

7171
private final AtomicLong requestIndex = new AtomicLong();
7272

7373

7474
DefaultWebTestClient(WebClient.Builder clientBuilder, ClientHttpConnector connector,
75-
@Nullable Duration timeout, WebTestClient.Builder webTestClientBuilder) {
75+
@Nullable Duration timeout, DefaultWebTestClientBuilder webTestClientBuilder) {
7676

7777
Assert.notNull(clientBuilder, "WebClient.Builder is required");
7878
this.wiretapConnector = new WiretapConnector(connector);
@@ -133,7 +133,7 @@ private RequestBodyUriSpec methodInternal(HttpMethod method) {
133133

134134
@Override
135135
public Builder mutate() {
136-
return this.builder;
136+
return new DefaultWebTestClientBuilder(this.builder);
137137
}
138138

139139
@Override

spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ class DefaultWebTestClientBuilder implements WebTestClient.Builder {
6060
this(null, httpHandlerBuilder, null, null);
6161
}
6262

63+
DefaultWebTestClientBuilder(DefaultWebTestClientBuilder other) {
64+
this(other.webClientBuilder.clone(), other.httpHandlerBuilder, other.connector,
65+
other.responseTimeout);
66+
}
67+
6368
DefaultWebTestClientBuilder(@Nullable WebClient.Builder webClientBuilder,
6469
@Nullable WebHttpHandlerBuilder httpHandlerBuilder, @Nullable ClientHttpConnector connector,
6570
@Nullable Duration responseTimeout) {
@@ -150,12 +155,8 @@ public WebTestClient build() {
150155
connectorToUse = new HttpHandlerConnector(this.httpHandlerBuilder.build());
151156
}
152157

153-
DefaultWebTestClientBuilder webTestClientBuilder = new DefaultWebTestClientBuilder(
154-
this.webClientBuilder.clone(), this.httpHandlerBuilder,
155-
this.connector, this.responseTimeout);
156-
157158
return new DefaultWebTestClient(this.webClientBuilder,
158-
connectorToUse, this.responseTimeout, webTestClientBuilder);
159+
connectorToUse, this.responseTimeout, new DefaultWebTestClientBuilder(this));
159160
}
160161

161162
}

spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerIntegrationTests.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.web.server.WebHandler;
2525

2626
import static java.nio.charset.StandardCharsets.UTF_8;
27+
import static org.junit.Assert.*;
2728

2829
/**
2930
* Mock server integration test scenarios.
@@ -68,4 +69,39 @@ public void sameSessionInstanceAfterMutate() throws Exception {
6869
.expectBody(String.class).isEqualTo("bar");
6970
}
7071

72+
@Test
73+
public void mutateDoesCopy() throws Exception {
74+
75+
WebTestClient.Builder builder = WebTestClient.bindToWebHandler(exchange -> exchange.getResponse().setComplete()).configureClient();
76+
builder.filter((request, next) -> next.exchange(request));
77+
builder.defaultHeader("foo", "bar");
78+
builder.defaultCookie("foo", "bar");
79+
WebTestClient client1 = builder.build();
80+
81+
builder.filter((request, next) -> next.exchange(request));
82+
builder.defaultHeader("baz", "qux");
83+
builder.defaultCookie("baz", "qux");
84+
WebTestClient client2 = builder.build();
85+
86+
WebTestClient.Builder mutatedBuilder = client1.mutate();
87+
88+
mutatedBuilder.filter((request, next) -> next.exchange(request));
89+
mutatedBuilder.defaultHeader("baz", "qux");
90+
mutatedBuilder.defaultCookie("baz", "qux");
91+
WebTestClient clientFromMutatedBuilder = mutatedBuilder.build();
92+
93+
client1.mutate().filters(filters -> assertEquals(1, filters.size()));
94+
client1.mutate().defaultHeaders(headers -> assertEquals(1, headers.size()));
95+
client1.mutate().defaultCookies(cookies -> assertEquals(1, cookies.size()));
96+
97+
client2.mutate().filters(filters -> assertEquals(2, filters.size()));
98+
client2.mutate().defaultHeaders(headers -> assertEquals(2, headers.size()));
99+
client2.mutate().defaultCookies(cookies -> assertEquals(2, cookies.size()));
100+
101+
clientFromMutatedBuilder.mutate().filters(filters -> assertEquals(2, filters.size()));
102+
clientFromMutatedBuilder.mutate().defaultHeaders(headers -> assertEquals(2, headers.size()));
103+
clientFromMutatedBuilder.mutate().defaultCookies(cookies -> assertEquals(2, cookies.size()));
104+
}
105+
106+
71107
}

0 commit comments

Comments
 (0)