From ed9b2966c079b73094f293e5d0c35abd9d59db09 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 27 Aug 2013 11:45:46 -0400 Subject: [PATCH] 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 --- .../test/web/servlet/MockMvc.java | 21 ++++++++++++------- .../web/servlet/MockMvcBuilderSupport.java | 5 +---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java b/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java index 15020df3a08..a25452dc800 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvc.java @@ -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 { 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 { * Private constructor, not for direct instantiation. * @see org.springframework.test.web.servlet.setup.MockMvcBuilders */ - MockMvc(MockFilterChain filterChain, ServletContext servletContext) { - Assert.notNull(servletContext, "A ServletContext is required"); - Assert.notNull(filterChain, "A MockFilterChain is required"); + MockMvc(TestDispatcherServlet servlet, Filter[] filters, ServletContext servletContext) { - this.filterChain = filterChain; + 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"); + + this.servlet = servlet; + this.filters = filters; this.servletContext = servletContext; } @@ -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); diff --git a/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java b/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java index d2e1054a636..925c6b0e9e8 100644 --- a/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java +++ b/spring-test-mvc/src/main/java/org/springframework/test/web/servlet/MockMvcBuilderSupport.java @@ -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 { 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);