Introduce AbstractMockMvcBuilder class
This change splits out an abstract base class from DefaultMockMvcBuilder with StandaloneMockMvcBuilder switching to extend the new abstract class (rather than DefaultMockMvcBuilder). Issue: SPR-11238
This commit is contained in:
parent
e3017c30bb
commit
2e4f38f6af
|
@ -42,7 +42,8 @@ public abstract class MockMvcBuilderSupport {
|
||||||
|
|
||||||
protected final MockMvc createMockMvc(Filter[] filters, MockServletConfig servletConfig,
|
protected final MockMvc createMockMvc(Filter[] filters, MockServletConfig servletConfig,
|
||||||
WebApplicationContext webAppContext, RequestBuilder defaultRequestBuilder,
|
WebApplicationContext webAppContext, RequestBuilder defaultRequestBuilder,
|
||||||
List<ResultMatcher> globalResultMatchers, List<ResultHandler> globalResultHandlers, Boolean dispatchOptions) {
|
List<ResultMatcher> globalResultMatchers, List<ResultHandler> globalResultHandlers,
|
||||||
|
Boolean dispatchOptions) {
|
||||||
|
|
||||||
ServletContext servletContext = webAppContext.getServletContext();
|
ServletContext servletContext = webAppContext.getServletContext();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,203 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2002-2013 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.mock.web.MockServletConfig;
|
||||||
|
import org.springframework.test.web.servlet.*;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract implementation of {@link org.springframework.test.web.servlet.MockMvcBuilder}
|
||||||
|
* with common methods for configuring filters, default request properties, global
|
||||||
|
* expectations and global result actions.
|
||||||
|
* <p>
|
||||||
|
* Sub-classes can use different strategies to prepare a WebApplicationContext to
|
||||||
|
* pass to the DispatcherServlet.
|
||||||
|
*
|
||||||
|
* @author Rossen Stoyanchev
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public abstract class AbstractMockMvcBuilder<B extends AbstractMockMvcBuilder<B>>
|
||||||
|
extends MockMvcBuilderSupport implements MockMvcBuilder {
|
||||||
|
|
||||||
|
private List<Filter> filters = new ArrayList<Filter>();
|
||||||
|
|
||||||
|
private RequestBuilder defaultRequestBuilder;
|
||||||
|
|
||||||
|
private final List<ResultMatcher> globalResultMatchers = new ArrayList<ResultMatcher>();
|
||||||
|
|
||||||
|
private final List<ResultHandler> globalResultHandlers = new ArrayList<ResultHandler>();
|
||||||
|
|
||||||
|
private Boolean dispatchOptions = Boolean.FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add filters mapped to any request (i.e. "/*"). For example:
|
||||||
|
*
|
||||||
|
* <pre class="code">
|
||||||
|
* mockMvcBuilder.addFilters(springSecurityFilterChain);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* <p>is the equivalent of the following web.xml configuration:
|
||||||
|
*
|
||||||
|
* <pre class="code">
|
||||||
|
* <filter-mapping>
|
||||||
|
* <filter-name>springSecurityFilterChain</filter-name>
|
||||||
|
* <url-pattern>/*</url-pattern>
|
||||||
|
* </filter-mapping>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* <p>Filters will be invoked in the order in which they are provided.
|
||||||
|
*
|
||||||
|
* @param filters the filters to add
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T addFilters(Filter... filters) {
|
||||||
|
Assert.notNull(filters, "filters cannot be null");
|
||||||
|
|
||||||
|
for(Filter f : filters) {
|
||||||
|
Assert.notNull(f, "filters cannot contain null values");
|
||||||
|
this.filters.add(f);
|
||||||
|
}
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a filter mapped to a specific set of patterns. For example:
|
||||||
|
*
|
||||||
|
* <pre class="code">
|
||||||
|
* mockMvcBuilder.addFilters(myResourceFilter, "/resources/*");
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* <p>is the equivalent of:
|
||||||
|
*
|
||||||
|
* <pre class="code">
|
||||||
|
* <filter-mapping>
|
||||||
|
* <filter-name>myResourceFilter</filter-name>
|
||||||
|
* <url-pattern>/resources/*</url-pattern>
|
||||||
|
* </filter-mapping>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* <p>Filters will be invoked in the order in which they are provided.
|
||||||
|
*
|
||||||
|
* @param filter the filter to add
|
||||||
|
* @param urlPatterns URL patterns to map to; if empty, "/*" is used by default
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T addFilter(Filter filter, String... urlPatterns) {
|
||||||
|
|
||||||
|
Assert.notNull(filter, "filter cannot be null");
|
||||||
|
Assert.notNull(urlPatterns, "urlPatterns cannot be null");
|
||||||
|
|
||||||
|
if(urlPatterns.length > 0) {
|
||||||
|
filter = new PatternMappingFilterProxy(filter, urlPatterns);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.filters.add(filter);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define default request properties that should be merged into all
|
||||||
|
* performed requests. In effect this provides a mechanism for defining
|
||||||
|
* common initialization for all requests such as the content type, request
|
||||||
|
* parameters, session attributes, and any other request property.
|
||||||
|
*
|
||||||
|
* <p>Properties specified at the time of performing a request override the
|
||||||
|
* default properties defined here.
|
||||||
|
*
|
||||||
|
* @param requestBuilder a RequestBuilder; see static factory methods in
|
||||||
|
* {@link org.springframework.test.web.servlet.request.MockMvcRequestBuilders}
|
||||||
|
* .
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T defaultRequest(RequestBuilder requestBuilder) {
|
||||||
|
this.defaultRequestBuilder = requestBuilder;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a global expectation that should <em>always</em> be applied to
|
||||||
|
* every response. For example, status code 200 (OK), content type
|
||||||
|
* {@code "application/json"}, etc.
|
||||||
|
*
|
||||||
|
* @param resultMatcher a ResultMatcher; see static factory methods in
|
||||||
|
* {@link org.springframework.test.web.servlet.result.MockMvcResultMatchers}
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T alwaysExpect(ResultMatcher resultMatcher) {
|
||||||
|
this.globalResultMatchers.add(resultMatcher);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a global action that should <em>always</em> be applied to every
|
||||||
|
* response. For example, writing detailed information about the performed
|
||||||
|
* request and resulting response to {@code System.out}.
|
||||||
|
*
|
||||||
|
* @param resultHandler a ResultHandler; see static factory methods in
|
||||||
|
* {@link org.springframework.test.web.servlet.result.MockMvcResultHandlers}
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T alwaysDo(ResultHandler resultHandler) {
|
||||||
|
this.globalResultHandlers.add(resultHandler);
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should the {@link org.springframework.web.servlet.DispatcherServlet} dispatch OPTIONS request to controllers.
|
||||||
|
* @param dispatchOptions
|
||||||
|
* @see org.springframework.web.servlet.DispatcherServlet#setDispatchOptionsRequest(boolean)
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final <T extends B> T dispatchOptions(boolean dispatchOptions) {
|
||||||
|
this.dispatchOptions = dispatchOptions;
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a {@link org.springframework.test.web.servlet.MockMvc} instance.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public final MockMvc build() {
|
||||||
|
|
||||||
|
WebApplicationContext wac = initWebAppContext();
|
||||||
|
|
||||||
|
ServletContext servletContext = wac.getServletContext();
|
||||||
|
MockServletConfig mockServletConfig = new MockServletConfig(servletContext);
|
||||||
|
|
||||||
|
Filter[] filterArray = this.filters.toArray(new Filter[this.filters.size()]);
|
||||||
|
|
||||||
|
return super.createMockMvc(filterArray, mockServletConfig, wac, this.defaultRequestBuilder,
|
||||||
|
this.globalResultMatchers, this.globalResultHandlers, this.dispatchOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A method to obtain the WebApplicationContext to be passed to the DispatcherServlet.
|
||||||
|
* Invoked from {@link #build()} before the
|
||||||
|
* {@link org.springframework.test.web.servlet.MockMvc} instance is created.
|
||||||
|
*/
|
||||||
|
protected abstract WebApplicationContext initWebAppContext();
|
||||||
|
|
||||||
|
}
|
|
@ -34,29 +34,17 @@ import org.springframework.web.context.WebApplicationContext;
|
||||||
import org.springframework.web.servlet.DispatcherServlet;
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An concrete implementation of {@link MockMvcBuilder} with methods for
|
* An concrete implementation of {@link AbstractMockMvcBuilder} that simply
|
||||||
* configuring filters, default request properties, and global expectations and
|
* provides the WebApplicationContext given to it as a constructor argument.
|
||||||
* result actions.
|
|
||||||
*
|
*
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
* @author Rob Winch
|
* @author Rob Winch
|
||||||
* @since 3.2
|
* @since 3.2
|
||||||
*/
|
*/
|
||||||
public class DefaultMockMvcBuilder<B extends DefaultMockMvcBuilder<B>> extends MockMvcBuilderSupport
|
public class DefaultMockMvcBuilder extends AbstractMockMvcBuilder<DefaultMockMvcBuilder> {
|
||||||
implements MockMvcBuilder {
|
|
||||||
|
|
||||||
private final WebApplicationContext webAppContext;
|
private final WebApplicationContext webAppContext;
|
||||||
|
|
||||||
private List<Filter> filters = new ArrayList<Filter>();
|
|
||||||
|
|
||||||
private RequestBuilder defaultRequestBuilder;
|
|
||||||
|
|
||||||
private final List<ResultMatcher> globalResultMatchers = new ArrayList<ResultMatcher>();
|
|
||||||
|
|
||||||
private final List<ResultHandler> globalResultHandlers = new ArrayList<ResultHandler>();
|
|
||||||
|
|
||||||
private Boolean dispatchOptions = Boolean.FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protected constructor. Not intended for direct instantiation.
|
* Protected constructor. Not intended for direct instantiation.
|
||||||
|
@ -68,153 +56,10 @@ public class DefaultMockMvcBuilder<B extends DefaultMockMvcBuilder<B>> extends M
|
||||||
this.webAppContext = webAppContext;
|
this.webAppContext = webAppContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add filters mapped to any request (i.e. "/*"). For example:
|
|
||||||
*
|
|
||||||
* <pre class="code">
|
|
||||||
* mockMvcBuilder.addFilters(springSecurityFilterChain);
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* <p>is the equivalent of the following web.xml configuration:
|
|
||||||
*
|
|
||||||
* <pre class="code">
|
|
||||||
* <filter-mapping>
|
|
||||||
* <filter-name>springSecurityFilterChain</filter-name>
|
|
||||||
* <url-pattern>/*</url-pattern>
|
|
||||||
* </filter-mapping>
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* <p>Filters will be invoked in the order in which they are provided.
|
|
||||||
*
|
|
||||||
* @param filters the filters to add
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T addFilters(Filter... filters) {
|
|
||||||
Assert.notNull(filters, "filters cannot be null");
|
|
||||||
|
|
||||||
for(Filter f : filters) {
|
|
||||||
Assert.notNull(f, "filters cannot contain null values");
|
|
||||||
this.filters.add(f);
|
|
||||||
}
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a filter mapped to a specific set of patterns. For example:
|
|
||||||
*
|
|
||||||
* <pre class="code">
|
|
||||||
* mockMvcBuilder.addFilters(myResourceFilter, "/resources/*");
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* <p>is the equivalent of:
|
|
||||||
*
|
|
||||||
* <pre class="code">
|
|
||||||
* <filter-mapping>
|
|
||||||
* <filter-name>myResourceFilter</filter-name>
|
|
||||||
* <url-pattern>/resources/*</url-pattern>
|
|
||||||
* </filter-mapping>
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* <p>Filters will be invoked in the order in which they are provided.
|
|
||||||
*
|
|
||||||
* @param filter the filter to add
|
|
||||||
* @param urlPatterns URL patterns to map to; if empty, "/*" is used by default
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T addFilter(Filter filter, String... urlPatterns) {
|
|
||||||
|
|
||||||
Assert.notNull(filter, "filter cannot be null");
|
|
||||||
Assert.notNull(urlPatterns, "urlPatterns cannot be null");
|
|
||||||
|
|
||||||
if(urlPatterns.length > 0) {
|
|
||||||
filter = new PatternMappingFilterProxy(filter, urlPatterns);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.filters.add(filter);
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define default request properties that should be merged into all
|
|
||||||
* performed requests. In effect this provides a mechanism for defining
|
|
||||||
* common initialization for all requests such as the content type, request
|
|
||||||
* parameters, session attributes, and any other request property.
|
|
||||||
*
|
|
||||||
* <p>Properties specified at the time of performing a request override the
|
|
||||||
* default properties defined here.
|
|
||||||
*
|
|
||||||
* @param requestBuilder a RequestBuilder; see static factory methods in
|
|
||||||
* {@link org.springframework.test.web.servlet.request.MockMvcRequestBuilders}
|
|
||||||
* .
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T defaultRequest(RequestBuilder requestBuilder) {
|
|
||||||
this.defaultRequestBuilder = requestBuilder;
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define a global expectation that should <em>always</em> be applied to
|
|
||||||
* every response. For example, status code 200 (OK), content type
|
|
||||||
* {@code "application/json"}, etc.
|
|
||||||
*
|
|
||||||
* @param resultMatcher a ResultMatcher; see static factory methods in
|
|
||||||
* {@link org.springframework.test.web.servlet.result.MockMvcResultMatchers}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T alwaysExpect(ResultMatcher resultMatcher) {
|
|
||||||
this.globalResultMatchers.add(resultMatcher);
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define a global action that should <em>always</em> be applied to every
|
|
||||||
* response. For example, writing detailed information about the performed
|
|
||||||
* request and resulting response to {@code System.out}.
|
|
||||||
*
|
|
||||||
* @param resultHandler a ResultHandler; see static factory methods in
|
|
||||||
* {@link org.springframework.test.web.servlet.result.MockMvcResultHandlers}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T alwaysDo(ResultHandler resultHandler) {
|
|
||||||
this.globalResultHandlers.add(resultHandler);
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Should the {@link DispatcherServlet} dispatch OPTIONS request to controllers.
|
|
||||||
* @param dispatchOptions
|
|
||||||
* @see DispatcherServlet#setDispatchOptionsRequest(boolean)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final <T extends B> T dispatchOptions(boolean dispatchOptions) {
|
|
||||||
this.dispatchOptions = dispatchOptions;
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build a {@link MockMvc} instance.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public final MockMvc build() {
|
protected WebApplicationContext initWebAppContext() {
|
||||||
|
return this.webAppContext;
|
||||||
initWebAppContext(this.webAppContext);
|
|
||||||
|
|
||||||
ServletContext servletContext = this.webAppContext.getServletContext();
|
|
||||||
MockServletConfig mockServletConfig = new MockServletConfig(servletContext);
|
|
||||||
|
|
||||||
Filter[] filterArray = this.filters.toArray(new Filter[this.filters.size()]);
|
|
||||||
|
|
||||||
return super.createMockMvc(filterArray, mockServletConfig, this.webAppContext,
|
|
||||||
this.defaultRequestBuilder, this.globalResultMatchers, this.globalResultHandlers,this.dispatchOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked from {@link #build()} before the {@link MockMvc} instance is created.
|
|
||||||
* Allows sub-classes to further initialize the {@code WebApplicationContext}
|
|
||||||
* and the {@code javax.servlet.ServletContext} it contains.
|
|
||||||
*/
|
|
||||||
protected void initWebAppContext(WebApplicationContext webAppContext) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,8 @@ public class MockMvcBuilders {
|
||||||
* application controllers in it. The context must have been configured with
|
* application controllers in it. The context must have been configured with
|
||||||
* a {@link ServletContext}.
|
* a {@link ServletContext}.
|
||||||
*/
|
*/
|
||||||
public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) {
|
public static DefaultMockMvcBuilder webAppContextSetup(WebApplicationContext context) {
|
||||||
return new DefaultMockMvcBuilder<B>(context);
|
return new DefaultMockMvcBuilder(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -82,7 +82,7 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
* @since 3.2
|
* @since 3.2
|
||||||
*/
|
*/
|
||||||
public class StandaloneMockMvcBuilder extends DefaultMockMvcBuilder<StandaloneMockMvcBuilder> {
|
public class StandaloneMockMvcBuilder extends AbstractMockMvcBuilder<StandaloneMockMvcBuilder> {
|
||||||
|
|
||||||
private final Object[] controllers;
|
private final Object[] controllers;
|
||||||
|
|
||||||
|
@ -124,7 +124,6 @@ public class StandaloneMockMvcBuilder extends DefaultMockMvcBuilder<StandaloneMo
|
||||||
* @see MockMvcBuilders#standaloneSetup(Object...)
|
* @see MockMvcBuilders#standaloneSetup(Object...)
|
||||||
*/
|
*/
|
||||||
protected StandaloneMockMvcBuilder(Object... controllers) {
|
protected StandaloneMockMvcBuilder(Object... controllers) {
|
||||||
super(new StubWebApplicationContext(new MockServletContext()));
|
|
||||||
Assert.isTrue(!ObjectUtils.isEmpty(controllers), "At least one controller is required");
|
Assert.isTrue(!ObjectUtils.isEmpty(controllers), "At least one controller is required");
|
||||||
this.controllers = controllers;
|
this.controllers = controllers;
|
||||||
}
|
}
|
||||||
|
@ -308,37 +307,39 @@ public class StandaloneMockMvcBuilder extends DefaultMockMvcBuilder<StandaloneMo
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initWebAppContext(WebApplicationContext cxt) {
|
protected WebApplicationContext initWebAppContext() {
|
||||||
StubWebApplicationContext mockCxt = (StubWebApplicationContext) cxt;
|
MockServletContext servletContext = new MockServletContext();
|
||||||
registerMvcSingletons(mockCxt);
|
StubWebApplicationContext wac = new StubWebApplicationContext(servletContext);
|
||||||
cxt.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, mockCxt);
|
registerMvcSingletons(wac);
|
||||||
|
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
|
||||||
|
return wac;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerMvcSingletons(StubWebApplicationContext cxt) {
|
private void registerMvcSingletons(StubWebApplicationContext wac) {
|
||||||
|
|
||||||
StandaloneConfiguration config = new StandaloneConfiguration();
|
StandaloneConfiguration config = new StandaloneConfiguration();
|
||||||
|
|
||||||
StaticRequestMappingHandlerMapping hm = config.getHandlerMapping();
|
StaticRequestMappingHandlerMapping hm = config.getHandlerMapping();
|
||||||
hm.setServletContext(cxt.getServletContext());
|
hm.setServletContext(wac.getServletContext());
|
||||||
hm.setApplicationContext(cxt);
|
hm.setApplicationContext(wac);
|
||||||
hm.registerHandlers(controllers);
|
hm.registerHandlers(this.controllers);
|
||||||
cxt.addBean("requestMappingHandlerMapping", hm);
|
wac.addBean("requestMappingHandlerMapping", hm);
|
||||||
|
|
||||||
RequestMappingHandlerAdapter handlerAdapter = config.requestMappingHandlerAdapter();
|
RequestMappingHandlerAdapter handlerAdapter = config.requestMappingHandlerAdapter();
|
||||||
handlerAdapter.setServletContext(cxt.getServletContext());
|
handlerAdapter.setServletContext(wac.getServletContext());
|
||||||
handlerAdapter.setApplicationContext(cxt);
|
handlerAdapter.setApplicationContext(wac);
|
||||||
handlerAdapter.afterPropertiesSet();
|
handlerAdapter.afterPropertiesSet();
|
||||||
cxt.addBean("requestMappingHandlerAdapter", handlerAdapter);
|
wac.addBean("requestMappingHandlerAdapter", handlerAdapter);
|
||||||
|
|
||||||
cxt.addBean("handlerExceptionResolver", config.handlerExceptionResolver());
|
wac.addBean("handlerExceptionResolver", config.handlerExceptionResolver());
|
||||||
|
|
||||||
cxt.addBeans(initViewResolvers(cxt));
|
wac.addBeans(initViewResolvers(wac));
|
||||||
cxt.addBean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, this.localeResolver);
|
wac.addBean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, this.localeResolver);
|
||||||
cxt.addBean(DispatcherServlet.THEME_RESOLVER_BEAN_NAME, new FixedThemeResolver());
|
wac.addBean(DispatcherServlet.THEME_RESOLVER_BEAN_NAME, new FixedThemeResolver());
|
||||||
cxt.addBean(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, new DefaultRequestToViewNameTranslator());
|
wac.addBean(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, new DefaultRequestToViewNameTranslator());
|
||||||
|
|
||||||
this.flashMapManager = new SessionFlashMapManager();
|
this.flashMapManager = new SessionFlashMapManager();
|
||||||
cxt.addBean(DispatcherServlet.FLASH_MAP_MANAGER_BEAN_NAME, this.flashMapManager);
|
wac.addBean(DispatcherServlet.FLASH_MAP_MANAGER_BEAN_NAME, this.flashMapManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ViewResolver> initViewResolvers(WebApplicationContext wac) {
|
private List<ViewResolver> initViewResolvers(WebApplicationContext wac) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
*/
|
*/
|
||||||
public class DefaultMockMvcBuilderTests {
|
public class DefaultMockMvcBuilderTests {
|
||||||
|
|
||||||
private DefaultMockMvcBuilder<?> builder;
|
private StandaloneMockMvcBuilder builder;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.springframework.mock.web.test.MockHttpServletRequest;
|
||||||
import org.springframework.mock.web.test.MockServletContext;
|
import org.springframework.mock.web.test.MockServletContext;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.method.HandlerMethod;
|
||||||
import org.springframework.web.servlet.HandlerExecutionChain;
|
import org.springframework.web.servlet.HandlerExecutionChain;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
||||||
|
@ -38,12 +39,11 @@ public class StandaloneMockMvcBuilderTests {
|
||||||
@Test
|
@Test
|
||||||
public void placeHoldersInRequestMapping() throws Exception {
|
public void placeHoldersInRequestMapping() throws Exception {
|
||||||
|
|
||||||
StubWebApplicationContext cxt = new StubWebApplicationContext(new MockServletContext());
|
TestStandaloneMockMvcBuilder builder = new TestStandaloneMockMvcBuilder(new PlaceholderController());
|
||||||
StandaloneMockMvcBuilder builder = new StandaloneMockMvcBuilder(new PlaceholderController());
|
|
||||||
builder.addPlaceHolderValue("sys.login.ajax", "/foo");
|
builder.addPlaceHolderValue("sys.login.ajax", "/foo");
|
||||||
builder.initWebAppContext(cxt);
|
builder.build();
|
||||||
|
|
||||||
RequestMappingHandlerMapping hm = cxt.getBean(RequestMappingHandlerMapping.class);
|
RequestMappingHandlerMapping hm = builder.wac.getBean(RequestMappingHandlerMapping.class);
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
|
||||||
HandlerExecutionChain chain = hm.getHandler(request);
|
HandlerExecutionChain chain = hm.getHandler(request);
|
||||||
|
@ -60,4 +60,19 @@ public class StandaloneMockMvcBuilderTests {
|
||||||
private void handleWithPlaceholders() { }
|
private void handleWithPlaceholders() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static class TestStandaloneMockMvcBuilder extends StandaloneMockMvcBuilder {
|
||||||
|
|
||||||
|
private WebApplicationContext wac;
|
||||||
|
|
||||||
|
private TestStandaloneMockMvcBuilder(Object... controllers) {
|
||||||
|
super(controllers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected WebApplicationContext initWebAppContext() {
|
||||||
|
this.wac = super.initWebAppContext();
|
||||||
|
return this.wac;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue