From 0c024439654e64939b5d1a9ecff145ed9eaf6c1f Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Fri, 29 Aug 2025 10:25:37 +0300 Subject: [PATCH] Consistently support no value params in query string Closes gh-35329 --- .../request/AbstractMockHttpServletRequestBuilder.java | 10 ++++++---- .../request/MockHttpServletRequestBuilderTests.java | 9 +++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java index a1b34f49a72..503f48f2ca1 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java @@ -911,10 +911,12 @@ public abstract class AbstractMockHttpServletRequestBuilder map) { - map.forEach((key, values) -> values.forEach(value -> { - value = (value != null ? UriUtils.decode(value, StandardCharsets.UTF_8) : null); - request.addParameter(UriUtils.decode(key, StandardCharsets.UTF_8), value); - })); + map.forEach((key, values) -> + request.addParameter( + UriUtils.decode(key, StandardCharsets.UTF_8), + values.stream() + .map(value -> value != null ? UriUtils.decode(value, StandardCharsets.UTF_8) : null) + .toArray(String[]::new))); } private byte[] writeFormData(MediaType mediaType, Charset charset) { diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java index 9225771224b..60f25994c3b 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/request/MockHttpServletRequestBuilderTests.java @@ -311,6 +311,15 @@ class MockHttpServletRequestBuilderTests { assertThat(request.getParameterMap().get("foo")).containsExactly(); } + @Test // gh-35210 + void queryStringWithoutValues() { + this.builder = new MockHttpServletRequestBuilder(GET).uri("/path?foo"); + MockHttpServletRequest request = this.builder.buildRequest(this.servletContext); + + assertThat(request.getQueryString()).isEqualTo("foo"); + assertThat(request.getParameterMap().get("foo")).containsExactly((String) null); + } + @Test void formField() { this.builder = new MockHttpServletRequestBuilder(POST).uri("/");