From 43afc149a14219c13f6830b6e503ac2c9c218f44 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 11 Jul 2016 16:38:10 -0700 Subject: [PATCH] Consider WebAppConfiguration in @SpringBootTest Update SpringBootTestContextBootstrapper to consider the `@WebAppConfiguration` annotation and use sensible resourceBasePath defaults. Fixes gh-6371 --- .../spring-boot-sample-war/pom.xml | 5 ++ .../java/sample/war/SampleWarApplication.java | 2 + .../src/main/webapp/WEB-INF/custom.properties | 1 + .../war/WarApplicationResourceTests.java | 42 +++++++++++ .../SpringBootTestContextBootstrapper.java | 9 ++- ...SpringBootTestWebEnvironmentMockTests.java | 7 ++ ...nmentMockWithWebAppConfigurationTests.java | 69 +++++++++++++++++++ 7 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 spring-boot-samples/spring-boot-sample-war/src/main/webapp/WEB-INF/custom.properties create mode 100644 spring-boot-samples/spring-boot-sample-war/src/test/java/sample/war/WarApplicationResourceTests.java create mode 100644 spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockWithWebAppConfigurationTests.java diff --git a/spring-boot-samples/spring-boot-sample-war/pom.xml b/spring-boot-samples/spring-boot-sample-war/pom.xml index 1883ba91a36..028df2c38f7 100644 --- a/spring-boot-samples/spring-boot-sample-war/pom.xml +++ b/spring-boot-samples/spring-boot-sample-war/pom.xml @@ -43,6 +43,11 @@ + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-boot-samples/spring-boot-sample-war/src/main/java/sample/war/SampleWarApplication.java b/spring-boot-samples/spring-boot-sample-war/src/main/java/sample/war/SampleWarApplication.java index 8e6c639fd2d..74b3b52d8de 100644 --- a/spring-boot-samples/spring-boot-sample-war/src/main/java/sample/war/SampleWarApplication.java +++ b/spring-boot-samples/spring-boot-sample-war/src/main/java/sample/war/SampleWarApplication.java @@ -19,11 +19,13 @@ package sample.war; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.PropertySource; /** * Sample WAR application */ @SpringBootApplication +@PropertySource(value = { "WEB-INF/custom.properties" }) public class SampleWarApplication extends SpringBootServletInitializer { public static void main(String[] args) { diff --git a/spring-boot-samples/spring-boot-sample-war/src/main/webapp/WEB-INF/custom.properties b/spring-boot-samples/spring-boot-sample-war/src/main/webapp/WEB-INF/custom.properties new file mode 100644 index 00000000000..602fc024753 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-war/src/main/webapp/WEB-INF/custom.properties @@ -0,0 +1 @@ +demo.string.value=demo diff --git a/spring-boot-samples/spring-boot-sample-war/src/test/java/sample/war/WarApplicationResourceTests.java b/spring-boot-samples/spring-boot-sample-war/src/test/java/sample/war/WarApplicationResourceTests.java new file mode 100644 index 00000000000..fce5637d9f7 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-war/src/test/java/sample/war/WarApplicationResourceTests.java @@ -0,0 +1,42 @@ +/* + * 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. + * 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 sample.war; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class WarApplicationResourceTests { + + // gh-6371 + + @Value("${demo.string.value}") + private String demoStringValue; + + @Test + public void contextLoads() { + assertThat(this.demoStringValue).isEqualTo("demo"); + } + +} diff --git a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java index 490e264359c..e6f0dc486b1 100644 --- a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java +++ b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java @@ -33,6 +33,7 @@ import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContext; import org.springframework.test.context.TestContextBootstrapper; import org.springframework.test.context.support.DefaultTestContextBootstrapper; +import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebMergedContextConfiguration; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -122,7 +123,13 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr if (webEnvironment != null) { if (webEnvironment.isEmbedded() || (webEnvironment == WebEnvironment.MOCK && hasWebEnvironmentClasses())) { - mergedConfig = new WebMergedContextConfiguration(mergedConfig, ""); + WebAppConfiguration webAppConfiguration = AnnotatedElementUtils + .findMergedAnnotation(mergedConfig.getTestClass(), + WebAppConfiguration.class); + String resourceBasePath = (webAppConfiguration == null ? "src/main/webapp" + : webAppConfiguration.value()); + mergedConfig = new WebMergedContextConfiguration(mergedConfig, + resourceBasePath); } } return mergedConfig; diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockTests.java index bfa8df8b700..7598f682372 100644 --- a/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockTests.java +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockTests.java @@ -29,6 +29,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -75,6 +76,12 @@ public class SpringBootTestWebEnvironmentMockTests { assertThat(attributes).isNotNull(); } + @Test + public void resourcePath() throws Exception { + assertThat(ReflectionTestUtils.getField(this.servletContext, "resourceBasePath")) + .isEqualTo("src/main/webapp"); + } + @Configuration @EnableWebMvc protected static class Config { diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockWithWebAppConfigurationTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockWithWebAppConfigurationTests.java new file mode 100644 index 00000000000..d8041d2d3c4 --- /dev/null +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestWebEnvironmentMockWithWebAppConfigurationTests.java @@ -0,0 +1,69 @@ +/* + * 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. + * 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.context; + +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.context.SpringBootTest.WebEnvironment; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringBootTest} configured with {@link WebEnvironment#MOCK}. + * + * @author Phillip Webb + * @author Andy Wilkinson + */ +@RunWith(SpringRunner.class) +@SpringBootTest +@DirtiesContext +@WebAppConfiguration("src/mymain/mywebapp") +public class SpringBootTestWebEnvironmentMockWithWebAppConfigurationTests { + + @Autowired + private ServletContext servletContext; + + @Test + public void resourcePath() throws Exception { + assertThat(ReflectionTestUtils.getField(this.servletContext, "resourceBasePath")) + .isEqualTo("src/mymain/mywebapp"); + } + + @Configuration + @EnableWebMvc + protected static class Config { + + @Bean + public static PropertySourcesPlaceholderConfigurer propertyPlaceholder() { + return new PropertySourcesPlaceholderConfigurer(); + } + + } + +}