AbstractMockHttpServletRequestBuilder#buildRequest is not idempotent #35493
+14
−3
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I have testing components making use of
MockHttpServletRequestBuilder
. These components should be able to mutate the builder but also to check the builder state (e.g. "what is the http method currently stored by the builder?").By design, the only way to access
MockHttpServletRequestBuilder
state is to invokebuildRequest
to retrieve aMockHttpServletRequest
that will allow to check the state via its getters.I am fine with that.
But I discovered that invoking
buildRequest
mutates the value ofMockHttpServletRequestBuilder#pathInfo
:spring-framework/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java
Lines 901 to 909 in 88812ed
This mutation can break the builder once you try to pass it to
MockMvc#perform
.An example of scenario:
MockMvc
has a non nulldefaultRequestBuilder
that will be merged in the consumer's providedMockHttpServletRequestBuilder
MockHttpServletRequestBuilder
instancefoo
MockHttpServletRequestBuilder#buildRequest
onfoo
(with the injectable ServletContext)MockMvc#perform
withfoo
as argumentTLDR: calling
buildRequest
twice on theMockHttpServletRequestBuilder
is not safe. This pull request fixes this.