Skip to content

Commit

Permalink
Add extension point to pre-configure a MockMvcBuilder
Browse files Browse the repository at this point in the history
Issue: SPR-11497
  • Loading branch information
rstoyanchev committed Jul 16, 2014
1 parent d86e4cf commit c2b0fac
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -50,6 +50,8 @@ public abstract class AbstractMockMvcBuilder<B extends AbstractMockMvcBuilder<B>

private Boolean dispatchOptions = Boolean.FALSE;

private final List<MockMvcConfigurer> configurers = new ArrayList<MockMvcConfigurer>(4);



/**
Expand Down Expand Up @@ -166,16 +168,28 @@ public final <T extends B> T alwaysDo(ResultHandler resultHandler) {
}

/**
* 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 extends B> T dispatchOptions(boolean dispatchOptions) {
this.dispatchOptions = dispatchOptions;
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 extends B> T add(MockMvcConfigurer configurer) {
configurer.afterConfigurerAdded(this);
this.configurers.add(configurer);
return (T) this;
}


/**
* Build a {@link org.springframework.test.web.servlet.MockMvc} instance.
*/
Expand All @@ -187,6 +201,10 @@ public final MockMvc build() {
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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
*
* <p>Supported via {@link AbstractMockMvcBuilder#add(MockMvcConfigurer)}
* with instances of class likely created via static methods, e.g.:
*
* <pre class="code">
* MockMvcBuilders.webAppContextSetup(context)
* .add(myLibrary("foo","bar").myProperty("foo"))
* .build();
* </pre>
*
* @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);

}

0 comments on commit c2b0fac

Please sign in to comment.