From 7709543e67748759a31d82c41a884d87811bab99 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 20 Apr 2016 10:39:42 +0100 Subject: [PATCH] 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 --- ...tContextApplicationContextInitializer.java | 26 +++++++- .../test/SpringApplicationContextLoader.java | 6 +- .../test/SpringApplicationMockMvcTests.java | 4 +- .../SpringApplicationMockServletTests.java | 61 +++++++++++++++++++ 4 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockServletTests.java diff --git a/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationContextInitializer.java b/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationContextInitializer.java index bbc47c21bf..57f1810ca0 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationContextInitializer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationContextInitializer.java @@ -1,5 +1,5 @@ /* - * 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"); * you may not use this file except in compliance with the License. @@ -18,14 +18,17 @@ package org.springframework.boot.context.web; import javax.servlet.ServletContext; +import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextInitializer; import org.springframework.core.Ordered; import org.springframework.web.context.ConfigurableWebApplicationContext; +import org.springframework.web.context.WebApplicationContext; /** * {@link ApplicationContextInitializer} for setting the servlet context. * * @author Dave Syer + * @author Phillip Webb */ public class ServletContextApplicationContextInitializer implements ApplicationContextInitializer, Ordered { @@ -34,12 +37,27 @@ public class ServletContextApplicationContextInitializer implements private final ServletContext servletContext; + private final boolean addApplicationContextAttribute; + /** * Create a new {@link ServletContextApplicationContextInitializer} instance. * @param servletContext the servlet that should be ultimately set. */ 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.addApplicationContextAttribute = addApplicationContextAttribute; } public void setOrder(int order) { @@ -54,6 +72,12 @@ public class ServletContextApplicationContextInitializer implements @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { applicationContext.setServletContext(this.servletContext); + if (this.addApplicationContextAttribute) { + this.servletContext.setAttribute( + WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, + applicationContext); + } + } } diff --git a/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java b/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java index 64b7cbd422..38a0cecf30 100644 --- a/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java @@ -1,5 +1,5 @@ /* - * 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"); * you may not use this file except in compliance with the License. @@ -241,8 +241,8 @@ public class SpringApplicationContextLoader extends AbstractContextLoader { WebMergedContextConfiguration webConfiguration) { SpringBootMockServletContext servletContext = new SpringBootMockServletContext( webConfiguration.getResourceBasePath()); - initializers.add(0, - new ServletContextApplicationContextInitializer(servletContext)); + initializers.add(0, new ServletContextApplicationContextInitializer( + servletContext, true)); } } diff --git a/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockMvcTests.java b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockMvcTests.java index 1abd57a183..9583a0eae2 100644 --- a/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockMvcTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockMvcTests.java @@ -1,5 +1,5 @@ /* - * 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"); * 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. 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 */ diff --git a/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockServletTests.java b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockServletTests.java new file mode 100644 index 0000000000..8fc4194e31 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationMockServletTests.java @@ -0,0 +1,61 @@ +/* + * 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 { + + } + +}