From e9abbe884cdc18fe88c6f013de39df4823e1632a Mon Sep 17 00:00:00 2001 From: Lorenzo Dee Date: Mon, 8 Apr 2019 17:20:06 +0800 Subject: [PATCH 1/3] Set resource base path to behave the same as @WebAppConfiguration and @SpringBootTest --- .../web/servlet/WebMvcTestContextBootstrapper.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java index b18a2138fcb7..60df64c3af07 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java @@ -17,8 +17,10 @@ package org.springframework.boot.test.autoconfigure.web.servlet; import org.springframework.boot.test.context.SpringBootTestContextBootstrapper; +import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContextBootstrapper; +import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebMergedContextConfiguration; /** @@ -31,8 +33,15 @@ class WebMvcTestContextBootstrapper extends SpringBootTestContextBootstrapper { @Override protected MergedContextConfiguration processMergedContextConfiguration( MergedContextConfiguration mergedConfig) { - return new WebMergedContextConfiguration( - super.processMergedContextConfiguration(mergedConfig), ""); + MergedContextConfiguration processedMergedConfiguration = super.processMergedContextConfiguration( + mergedConfig); + WebAppConfiguration webAppConfiguration = AnnotatedElementUtils + .findMergedAnnotation(mergedConfig.getTestClass(), + WebAppConfiguration.class); + String resourceBasePath = (webAppConfiguration != null) + ? webAppConfiguration.value() : "src/main/webapp"; + return new WebMergedContextConfiguration(processedMergedConfiguration, + resourceBasePath); } } From 23ec39b66d85c41a59642d8a56028b46ecc12100 Mon Sep 17 00:00:00 2001 From: Lorenzo Dee Date: Wed, 10 Apr 2019 10:00:38 +0800 Subject: [PATCH 2/3] Add tests for fix to #16484 --- .../WebMvcTestContextBootstrapper.java | 1 + .../src/main/webapp/inwebapp | 0 ...WebMvcTestServletContextResourceTests.java | 61 ++++++++++++++++++ ...ebMvcTestWithWebAppConfigurationTests.java | 64 +++++++++++++++++++ .../META-INF/resources/inmetainfresources | 0 .../src/test/resources/public/inpublic | 0 .../src/test/resources/resources/inresources | 0 .../src/test/resources/static/instatic | 0 .../src/test/webapp/inwebapp | 0 9 files changed, 126 insertions(+) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/webapp/inwebapp create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletContextResourceTests.java create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithWebAppConfigurationTests.java create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/META-INF/resources/inmetainfresources create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/public/inpublic create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/resources/inresources create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/static/instatic create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/webapp/inwebapp diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java index 60df64c3af07..06c5eaa9b4f2 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java @@ -27,6 +27,7 @@ * {@link TestContextBootstrapper} for {@link WebMvcTest @WebMvcTest} support. * * @author Phillip Webb + * @author Lorenzo Dee */ class WebMvcTestContextBootstrapper extends SpringBootTestContextBootstrapper { diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/webapp/inwebapp b/spring-boot-project/spring-boot-test-autoconfigure/src/main/webapp/inwebapp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletContextResourceTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletContextResourceTests.java new file mode 100644 index 000000000000..772a0573d8af --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletContextResourceTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2019 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 + * + * https://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.autoconfigure.web.servlet.mockmvc; + +import java.net.MalformedURLException; +import java.net.URL; + +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.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WebMvcTest} when loading resources via {@link ServletContext}. + * + * @author Lorenzo Dee + */ +@RunWith(SpringRunner.class) +@WebMvcTest +public class WebMvcTestServletContextResourceTests { + + @Autowired + private ServletContext servletContext; + + @Test + public void getResourceLocation() throws Exception { + testResource("/inwebapp", "src/main/webapp"); + testResource("/inmetainfresources", "/META-INF/resources"); + testResource("/inresources", "/resources"); + testResource("/instatic", "/static"); + testResource("/inpublic", "/public"); + } + + private void testResource(String path, String expectedLocation) + throws MalformedURLException { + URL resource = this.servletContext.getResource(path); + assertThat(resource).isNotNull(); + assertThat(resource.getPath()).contains(expectedLocation); + } + +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithWebAppConfigurationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithWebAppConfigurationTests.java new file mode 100644 index 000000000000..ac738584d49c --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithWebAppConfigurationTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2019 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 + * + * https://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.autoconfigure.web.servlet.mockmvc; + +import java.net.MalformedURLException; +import java.net.URL; + +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.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WebMvcTest} when loading resources via {@link ServletContext} with + * {@link WebAppConfiguration}. + * + * @author Lorenzo Dee + */ +@RunWith(SpringRunner.class) +@WebMvcTest +@WebAppConfiguration("src/test/webapp") +public class WebMvcTestWithWebAppConfigurationTests { + + @Autowired + private ServletContext servletContext; + + @Test + public void getResourceLocation() throws Exception { + testResource("/inwebapp", "src/test/webapp"); + testResource("/inmetainfresources", "/META-INF/resources"); + testResource("/inresources", "/resources"); + testResource("/instatic", "/static"); + testResource("/inpublic", "/public"); + } + + private void testResource(String path, String expectedLocation) + throws MalformedURLException { + URL resource = this.servletContext.getResource(path); + assertThat(resource).isNotNull(); + assertThat(resource.getPath()).contains(expectedLocation); + } + +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/META-INF/resources/inmetainfresources b/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/META-INF/resources/inmetainfresources new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/public/inpublic b/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/public/inpublic new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/resources/inresources b/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/resources/inresources new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/static/instatic b/spring-boot-project/spring-boot-test-autoconfigure/src/test/resources/static/instatic new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/webapp/inwebapp b/spring-boot-project/spring-boot-test-autoconfigure/src/test/webapp/inwebapp new file mode 100644 index 000000000000..e69de29bb2d1 From acfb2a68d6b8a706cde1df50952afaa027451e92 Mon Sep 17 00:00:00 2001 From: Lorenzo Dee Date: Wed, 10 Apr 2019 10:22:36 +0800 Subject: [PATCH 3/3] Extracted method with identical logic in determining servlet resource base path ( #16484 ) --- .../servlet/WebMvcTestContextBootstrapper.java | 9 +-------- .../SpringBootTestContextBootstrapper.java | 17 +++++++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java index 06c5eaa9b4f2..efc7ef27d90b 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestContextBootstrapper.java @@ -17,10 +17,8 @@ package org.springframework.boot.test.autoconfigure.web.servlet; import org.springframework.boot.test.context.SpringBootTestContextBootstrapper; -import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContextBootstrapper; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebMergedContextConfiguration; /** @@ -36,13 +34,8 @@ protected MergedContextConfiguration processMergedContextConfiguration( MergedContextConfiguration mergedConfig) { MergedContextConfiguration processedMergedConfiguration = super.processMergedContextConfiguration( mergedConfig); - WebAppConfiguration webAppConfiguration = AnnotatedElementUtils - .findMergedAnnotation(mergedConfig.getTestClass(), - WebAppConfiguration.class); - String resourceBasePath = (webAppConfiguration != null) - ? webAppConfiguration.value() : "src/main/webapp"; return new WebMergedContextConfiguration(processedMergedConfiguration, - resourceBasePath); + getServletResourceBasePath(mergedConfig)); } } diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java index c7581b1f0bfd..07d95d7d9089 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextBootstrapper.java @@ -71,6 +71,7 @@ * @author Andy Wilkinson * @author Brian Clozel * @author Madhura Bhave + * @author Lorenzo Dee * @since 1.4.0 * @see SpringBootTest * @see TestConfiguration @@ -163,13 +164,8 @@ protected MergedContextConfiguration processMergedContextConfiguration( if (webApplicationType == WebApplicationType.SERVLET && (webEnvironment.isEmbedded() || webEnvironment == WebEnvironment.MOCK)) { - WebAppConfiguration webAppConfiguration = AnnotatedElementUtils - .findMergedAnnotation(mergedConfig.getTestClass(), - WebAppConfiguration.class); - String resourceBasePath = (webAppConfiguration != null) - ? webAppConfiguration.value() : "src/main/webapp"; mergedConfig = new WebMergedContextConfiguration(mergedConfig, - resourceBasePath); + getServletResourceBasePath(mergedConfig)); } else if (webApplicationType == WebApplicationType.REACTIVE && (webEnvironment.isEmbedded() @@ -180,6 +176,15 @@ else if (webApplicationType == WebApplicationType.REACTIVE return mergedConfig; } + protected String getServletResourceBasePath( + MergedContextConfiguration configuration) { + WebAppConfiguration webAppConfiguration = AnnotatedElementUtils + .findMergedAnnotation(configuration.getTestClass(), + WebAppConfiguration.class); + return (webAppConfiguration != null) ? webAppConfiguration.value() + : "src/main/webapp"; + } + private WebApplicationType getWebApplicationType( MergedContextConfiguration configuration) { ConfigurationPropertySource source = new MapConfigurationPropertySource(