Do not reuse mock requests in Spring MVC Test
SPR-13211 introduced support for reusing mock requests in Spring MVC Test if the request was created by the the Spring TestContext Framework. Unfortunately, that change makes it impossible for MockMvc.perform() to be invoked multiple times within the same test method without side effects. For example, session attributes and request parameters are transparently and unexpectedly retained for subsequent invocations of perform(), causing certain categories of tests to fail. This commit reverts the changes introduced in SPR-13211 and introduces a new MockMvcReuseTests class to serve as regression tests within Spring's test suite. Issue: SPR-13260, SPR-13211
This commit is contained in:
@@ -29,7 +29,6 @@ import java.util.Map.Entry;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.Mergeable;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
@@ -39,7 +38,6 @@ import org.springframework.http.MediaType;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.mock.web.MockHttpSession;
|
||||
import org.springframework.test.context.web.ServletTestExecutionListener;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
@@ -48,9 +46,6 @@ import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.ValueConstants;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.request.RequestAttributes;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||
import org.springframework.web.servlet.DispatcherServlet;
|
||||
import org.springframework.web.servlet.FlashMap;
|
||||
@@ -645,31 +640,11 @@ public class MockHttpServletRequestBuilder
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a {@link MockHttpServletRequest}.
|
||||
* <p>If an instance of {@code MockHttpServletRequest} that was created
|
||||
* by the <em>Spring TestContext Framework</em> is available via the
|
||||
* {@link RequestAttributes} bound to the current thread in
|
||||
* {@link RequestContextHolder}, this method simply returns that instance.
|
||||
* <p>Otherwise, this method creates a new {@code MockHttpServletRequest}
|
||||
* based on the supplied {@link ServletContext}.
|
||||
* Create a new {@link MockHttpServletRequest} based on the supplied
|
||||
* {@code ServletContext}.
|
||||
* <p>Can be overridden in subclasses.
|
||||
* @see RequestContextHolder#getRequestAttributes()
|
||||
* @see ServletRequestAttributes
|
||||
* @see ServletTestExecutionListener#CREATED_BY_THE_TESTCONTEXT_FRAMEWORK
|
||||
*/
|
||||
protected MockHttpServletRequest createServletRequest(ServletContext servletContext) {
|
||||
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
||||
if (requestAttributes instanceof ServletRequestAttributes) {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
|
||||
if (request instanceof MockHttpServletRequest) {
|
||||
MockHttpServletRequest mockRequest = (MockHttpServletRequest) request;
|
||||
Object createdByTcf = mockRequest.getAttribute(ServletTestExecutionListener.CREATED_BY_THE_TESTCONTEXT_FRAMEWORK);
|
||||
if (Boolean.TRUE.equals(createdByTcf)) {
|
||||
return mockRequest;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new MockHttpServletRequest(servletContext);
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,6 @@ public class MockMultipartHttpServletRequestBuilder extends MockHttpServletReque
|
||||
* Create a new {@link MockMultipartHttpServletRequest} based on the
|
||||
* supplied {@code ServletContext} and the {@code MockMultipartFiles}
|
||||
* added to this builder.
|
||||
* <p>Can be overridden in subclasses.
|
||||
*/
|
||||
@Override
|
||||
protected final MockHttpServletRequest createServletRequest(ServletContext servletContext) {
|
||||
|
||||
Reference in New Issue
Block a user