AbstractMockHttpServletRequestBuilder#buildRequest is not idempotent #35493
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
MockHttpServletRequestBuilderstate is to invokebuildRequestto retrieve aMockHttpServletRequestthat will allow to check the state via its getters.I am fine with that.
But I discovered that invoking
buildRequestmutates 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:
MockMvchas a non nulldefaultRequestBuilderthat will be merged in the consumer's providedMockHttpServletRequestBuilderMockHttpServletRequestBuilderinstancefooMockHttpServletRequestBuilder#buildRequestonfoo(with the injectable ServletContext)MockMvc#performwithfooas argumentTLDR: calling
buildRequesttwice on theMockHttpServletRequestBuilderis not safe. This pull request fixes this.