Browse Source

Revise use of FilterChain in MockMvc

MockFilterChain should not be re-used across requests. This is not an
issue unless tests are executed concurrently. This change ensures the
MockFilterChain is re-created for each request in MockMvc.

Issue: SPR-10838
pull/345/merge
Rossen Stoyanchev 13 years ago
parent
commit
ed9b2966c0
  1. 19
      spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java
  2. 5
      spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java

19
spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java

@ -19,6 +19,7 @@ package org.springframework.test.web.servlet; @@ -19,6 +19,7 @@ package org.springframework.test.web.servlet;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.ServletContext;
import org.springframework.beans.Mergeable;
@ -54,7 +55,9 @@ public final class MockMvc { @@ -54,7 +55,9 @@ public final class MockMvc {
static String MVC_RESULT_ATTRIBUTE = MockMvc.class.getName().concat(".MVC_RESULT_ATTRIBUTE");
private final MockFilterChain filterChain;
private final TestDispatcherServlet servlet;
private final Filter[] filters;
private final ServletContext servletContext;
@ -69,11 +72,15 @@ public final class MockMvc { @@ -69,11 +72,15 @@ public final class MockMvc {
* Private constructor, not for direct instantiation.
* @see org.springframework.test.web.servlet.setup.MockMvcBuilders
*/
MockMvc(MockFilterChain filterChain, ServletContext servletContext) {
MockMvc(TestDispatcherServlet servlet, Filter[] filters, ServletContext servletContext) {
Assert.notNull(servlet, "DispatcherServlet is required");
Assert.notNull(filters, "filters cannot be null");
Assert.noNullElements(filters, "filters cannot contain null values");
Assert.notNull(servletContext, "A ServletContext is required");
Assert.notNull(filterChain, "A MockFilterChain is required");
this.filterChain = filterChain;
this.servlet = servlet;
this.filters = filters;
this.servletContext = servletContext;
}
@ -130,8 +137,8 @@ public final class MockMvc { @@ -130,8 +137,8 @@ public final class MockMvc {
final MvcResult mvcResult = new DefaultMvcResult(request, response);
request.setAttribute(MVC_RESULT_ATTRIBUTE, mvcResult);
this.filterChain.reset();
this.filterChain.doFilter(request, response);
MockFilterChain filterChain = new MockFilterChain(this.servlet, this.filters);
filterChain.doFilter(request, response);
applyDefaultResultActions(mvcResult);

5
spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java

@ -23,7 +23,6 @@ import javax.servlet.ServletContext; @@ -23,7 +23,6 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.core.NestedRuntimeException;
import org.springframework.mock.web.MockFilterChain;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.web.context.WebApplicationContext;
@ -57,9 +56,7 @@ public abstract class MockMvcBuilderSupport { @@ -57,9 +56,7 @@ public abstract class MockMvcBuilderSupport {
throw new MockMvcBuildException("Failed to initialize TestDispatcherServlet", ex);
}
MockFilterChain filterChain = new MockFilterChain(dispatcherServlet, filters);
MockMvc mockMvc = new MockMvc(filterChain, servletContext);
MockMvc mockMvc = new MockMvc(dispatcherServlet, filters, servletContext);
mockMvc.setDefaultRequest(defaultRequestBuilder);
mockMvc.setGlobalResultMatchers(globalResultMatchers);
mockMvc.setGlobalResultHandlers(globalResultHandlers);

Loading…
Cancel
Save