From b71baf2c3811f7f613ca7ac6ff3da536ee1b0265 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 20 Jan 2017 16:24:42 +0000 Subject: [PATCH] Support @ContextHierarchy when using @SpringBootTest Closes gh-8000 --- .../test/context/SpringBootContextLoader.java | 25 ++++++- .../SpringBootTestContextHierarchyTests.java | 69 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestContextHierarchyTests.java diff --git a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java index f49bbf955e3..8adf675b211 100644 --- a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java +++ b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -33,8 +33,10 @@ import org.springframework.boot.web.support.ServletContextApplicationContextInit import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.Ordered; import org.springframework.core.SpringVersion; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; @@ -187,6 +189,10 @@ public class SpringBootContextLoader extends AbstractContextLoader { .getContextInitializerClasses()) { initializers.add(BeanUtils.instantiate(initializerClass)); } + if (config.getParent() != null) { + initializers.add(new ParentContextApplicationContextInitializer( + config.getParentApplicationContext())); + } return initializers; } @@ -295,4 +301,21 @@ public class SpringBootContextLoader extends AbstractContextLoader { } + @Order(Ordered.HIGHEST_PRECEDENCE) + private static class ParentContextApplicationContextInitializer + implements ApplicationContextInitializer { + + private final ApplicationContext parent; + + ParentContextApplicationContextInitializer(ApplicationContext parent) { + this.parent = parent; + } + + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + applicationContext.setParent(this.parent); + } + + } + } diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestContextHierarchyTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestContextHierarchyTests.java new file mode 100644 index 00000000000..c185ade2d12 --- /dev/null +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestContextHierarchyTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2017 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 org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.boot.test.context.SpringBootTestContextHierarchyTests.ChildConfiguration; +import org.springframework.boot.test.context.SpringBootTestContextHierarchyTests.ParentConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.ContextHierarchy; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Tests for {@link SpringBootTest} and {@link ContextHierarchy}. + * + * @author Andy Wilkinson + */ +@SpringBootTest +@ContextHierarchy({ @ContextConfiguration(classes = ParentConfiguration.class), + @ContextConfiguration(classes = ChildConfiguration.class) }) +@RunWith(SpringRunner.class) +public class SpringBootTestContextHierarchyTests { + + @Test + public void contextLoads() { + + } + + @Configuration + static class ParentConfiguration { + + @Bean + MyBean myBean() { + return new MyBean(); + } + + } + + @Configuration + static class ChildConfiguration { + + ChildConfiguration(MyBean myBean) { + + } + + } + + static class MyBean { + + } + +}