Commit 7709543e authored by Andy Wilkinson's avatar Andy Wilkinson

Set web application context on ServletContext in plain web app tests

Previously, the web application context was only set on the
ServletContext in a full-blown integration test or when MockMvc was
used.

This commit updates SpringApplicationContextLoader so that the context
is also set on the context in a plain web application test (one where
MockMvc is not being used). The change is a partial backport of commit
7dffb702.

Closes gh-4370
parent a19eeaf9
/* /*
* Copyright 2010-2012 the original author or authors. * Copyright 2010-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -18,14 +18,17 @@ package org.springframework.boot.context.web; ...@@ -18,14 +18,17 @@ package org.springframework.boot.context.web;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ApplicationContextInitializer;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.ConfigurableWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;
/** /**
* {@link ApplicationContextInitializer} for setting the servlet context. * {@link ApplicationContextInitializer} for setting the servlet context.
* *
* @author Dave Syer * @author Dave Syer
* @author Phillip Webb
*/ */
public class ServletContextApplicationContextInitializer implements public class ServletContextApplicationContextInitializer implements
ApplicationContextInitializer<ConfigurableWebApplicationContext>, Ordered { ApplicationContextInitializer<ConfigurableWebApplicationContext>, Ordered {
...@@ -34,12 +37,27 @@ public class ServletContextApplicationContextInitializer implements ...@@ -34,12 +37,27 @@ public class ServletContextApplicationContextInitializer implements
private final ServletContext servletContext; private final ServletContext servletContext;
private final boolean addApplicationContextAttribute;
/** /**
* Create a new {@link ServletContextApplicationContextInitializer} instance. * Create a new {@link ServletContextApplicationContextInitializer} instance.
* @param servletContext the servlet that should be ultimately set. * @param servletContext the servlet that should be ultimately set.
*/ */
public ServletContextApplicationContextInitializer(ServletContext servletContext) { public ServletContextApplicationContextInitializer(ServletContext servletContext) {
this(servletContext, false);
}
/**
* Create a new {@link ServletContextApplicationContextInitializer} instance.
* @param servletContext the servlet that should be ultimately set.
* @param addApplicationContextAttribute if the {@link ApplicationContext} should be
* stored as an attribute in the {@link ServletContext}
* @since 1.3.4
*/
public ServletContextApplicationContextInitializer(ServletContext servletContext,
boolean addApplicationContextAttribute) {
this.servletContext = servletContext; this.servletContext = servletContext;
this.addApplicationContextAttribute = addApplicationContextAttribute;
} }
public void setOrder(int order) { public void setOrder(int order) {
...@@ -54,6 +72,12 @@ public class ServletContextApplicationContextInitializer implements ...@@ -54,6 +72,12 @@ public class ServletContextApplicationContextInitializer implements
@Override @Override
public void initialize(ConfigurableWebApplicationContext applicationContext) { public void initialize(ConfigurableWebApplicationContext applicationContext) {
applicationContext.setServletContext(this.servletContext); applicationContext.setServletContext(this.servletContext);
if (this.addApplicationContextAttribute) {
this.servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
applicationContext);
}
} }
} }
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -241,8 +241,8 @@ public class SpringApplicationContextLoader extends AbstractContextLoader { ...@@ -241,8 +241,8 @@ public class SpringApplicationContextLoader extends AbstractContextLoader {
WebMergedContextConfiguration webConfiguration) { WebMergedContextConfiguration webConfiguration) {
SpringBootMockServletContext servletContext = new SpringBootMockServletContext( SpringBootMockServletContext servletContext = new SpringBootMockServletContext(
webConfiguration.getResourceBasePath()); webConfiguration.getResourceBasePath());
initializers.add(0, initializers.add(0, new ServletContextApplicationContextInitializer(
new ServletContextApplicationContextInitializer(servletContext)); servletContext, true));
} }
} }
......
/* /*
* Copyright 2012-2015 the original author or authors. * Copyright 2012-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -41,7 +41,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. ...@@ -41,7 +41,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/** /**
* Tests for {@link WebAppConfiguration} integration. * Tests for {@link WebAppConfiguration} with {@link MockMvc}.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
......
/*
* Copyright 2012-2015 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.boot.test;
import javax.servlet.ServletContext;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationMockServletTests.Config;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import static org.junit.Assert.assertSame;
/**
* Tests for {@link WebAppConfiguration} with a plain mock Servlet environment.
*
* @author Andy Wilkinson
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Config.class)
@WebAppConfiguration
public class SpringApplicationMockServletTests {
@Autowired
private WebApplicationContext context;
@Autowired
private ServletContext servletContext;
@Test
public void webApplicationContextIsSetOnServletContext() {
assertSame(this.context,
WebApplicationContextUtils.getWebApplicationContext(this.servletContext));
}
@Configuration
protected static class Config {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment