diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/AbstractMockMvcBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/AbstractMockMvcBuilder.java index 67d86ca76ae..e92b8c7d7ff 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/AbstractMockMvcBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/AbstractMockMvcBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,8 @@ public abstract class AbstractMockMvcBuilder private Boolean dispatchOptions = Boolean.FALSE; + private final List configurers = new ArrayList(4); + /** @@ -166,9 +168,9 @@ public abstract class AbstractMockMvcBuilder } /** - * Should the {@link org.springframework.web.servlet.DispatcherServlet} dispatch OPTIONS request to controllers. - * @param dispatchOptions - * @see org.springframework.web.servlet.DispatcherServlet#setDispatchOptionsRequest(boolean) + * Whether to enable the DispatcherServlet property + * {@link org.springframework.web.servlet.DispatcherServlet#setDispatchOptionsRequest + * dispatchOptionsRequest} which allows processing of HTTP OPTIONS requests. */ @SuppressWarnings("unchecked") public final T dispatchOptions(boolean dispatchOptions) { @@ -176,6 +178,18 @@ public abstract class AbstractMockMvcBuilder return (T) this; } + /** + * Add a {@code MockMvcConfigurer} which encapsulates ways to further configure + * this MockMvcBuilder with some specific purpose in mind. + */ + @SuppressWarnings("unchecked") + public final T add(MockMvcConfigurer configurer) { + configurer.afterConfigurerAdded(this); + this.configurers.add(configurer); + return (T) this; + } + + /** * Build a {@link org.springframework.test.web.servlet.MockMvc} instance. */ @@ -187,6 +201,10 @@ public abstract class AbstractMockMvcBuilder ServletContext servletContext = wac.getServletContext(); MockServletConfig mockServletConfig = new MockServletConfig(servletContext); + for (MockMvcConfigurer configurer : this.configurers) { + configurer.beforeMockMvcCreated(this, this.defaultRequestBuilder, wac); + } + Filter[] filterArray = this.filters.toArray(new Filter[this.filters.size()]); return super.createMockMvc(filterArray, mockServletConfig, wac, this.defaultRequestBuilder, diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/MockMvcConfigurer.java b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/MockMvcConfigurer.java new file mode 100644 index 00000000000..0ee733762e7 --- /dev/null +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/MockMvcConfigurer.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.test.web.servlet.setup; + +import org.springframework.test.web.servlet.MockMvcBuilder; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.web.context.WebApplicationContext; + +/** + * A contract that allows the encapsulation of a "recipe" for configuring a + * MockMvcBuilder for some specific purpose. For example a 3rd party library + * may use this to provide convenient, easy ways to set up MockMvc. + * + *

Supported via {@link AbstractMockMvcBuilder#add(MockMvcConfigurer)} + * with instances of class likely created via static methods, e.g.: + * + *

+ * 	MockMvcBuilders.webAppContextSetup(context)
+ * 		.add(myLibrary("foo","bar").myProperty("foo"))
+ * 		.build();
+ * 
+ * + * @author Rossen Stoyanchev + * @since 4.1 + */ +public interface MockMvcConfigurer { + + + /** + * Invoked immediately after a {@code MockMvcConfigurer} is configured via + * {@link AbstractMockMvcBuilder#add(MockMvcConfigurer)}. + */ + void afterConfigurerAdded(MockMvcBuilder mockMvcBuilder); + + /** + * Invoked just before the MockMvc instance is built providing access to the + * configured "default" RequestBuilder. If a "default" RequestBuilder is + * needed but was not configured and is {@code null}), it can still be added + * via {@link AbstractMockMvcBuilder#defaultRequest}. + */ + void beforeMockMvcCreated(MockMvcBuilder mockMvcBuilder, RequestBuilder defaultRequestBuilder, + WebApplicationContext applicationContext); + +}