/* * Copyright 2002-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.test.context.support; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.Test; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextHierarchy; import org.springframework.test.context.ContextLoader; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.springframework.test.context.support.ContextLoaderUtils.*; /** * Unit tests for {@link ContextLoaderUtils} involving context hierarchies. * * @author Sam Brannen * @since 3.2.2 */ public class ContextLoaderUtilsContextHierarchyTests extends AbstractContextConfigurationUtilsTests { private void debugConfigAttributes(List<ContextConfigurationAttributes> configAttributesList) { // for (ContextConfigurationAttributes configAttributes : configAttributesList) { // System.err.println(configAttributes); // } } @Test(expected = IllegalStateException.class) public void resolveContextHierarchyAttributesForSingleTestClassWithContextConfigurationAndContextHierarchy() { resolveContextHierarchyAttributes(SingleTestClassWithContextConfigurationAndContextHierarchy.class); } @Test(expected = IllegalStateException.class) public void resolveContextHierarchyAttributesForSingleTestClassWithContextConfigurationAndContextHierarchyOnSingleMetaAnnotation() { resolveContextHierarchyAttributes(SingleTestClassWithContextConfigurationAndContextHierarchyOnSingleMetaAnnotation.class); } @Test public void resolveContextHierarchyAttributesForSingleTestClassWithImplicitSingleLevelContextHierarchy() { List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(BareAnnotations.class); assertEquals(1, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesList = hierarchyAttributes.get(0); assertEquals(1, configAttributesList.size()); debugConfigAttributes(configAttributesList); } @Test public void resolveContextHierarchyAttributesForSingleTestClassWithSingleLevelContextHierarchy() { List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(SingleTestClassWithSingleLevelContextHierarchy.class); assertEquals(1, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesList = hierarchyAttributes.get(0); assertEquals(1, configAttributesList.size()); debugConfigAttributes(configAttributesList); } @Test public void resolveContextHierarchyAttributesForSingleTestClassWithSingleLevelContextHierarchyFromMetaAnnotation() { Class<SingleTestClassWithSingleLevelContextHierarchyFromMetaAnnotation> testClass = SingleTestClassWithSingleLevelContextHierarchyFromMetaAnnotation.class; List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(testClass); assertEquals(1, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesList = hierarchyAttributes.get(0); assertNotNull(configAttributesList); assertEquals(1, configAttributesList.size()); debugConfigAttributes(configAttributesList); assertAttributes(configAttributesList.get(0), testClass, new String[] { "A.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); } @Test public void resolveContextHierarchyAttributesForSingleTestClassWithTripleLevelContextHierarchy() { Class<SingleTestClassWithTripleLevelContextHierarchy> testClass = SingleTestClassWithTripleLevelContextHierarchy.class; List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(testClass); assertEquals(1, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesList = hierarchyAttributes.get(0); assertNotNull(configAttributesList); assertEquals(3, configAttributesList.size()); debugConfigAttributes(configAttributesList); assertAttributes(configAttributesList.get(0), testClass, new String[] { "A.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); assertAttributes(configAttributesList.get(1), testClass, new String[] { "B.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); assertAttributes(configAttributesList.get(2), testClass, new String[] { "C.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithSingleLevelContextHierarchies() { List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(TestClass3WithSingleLevelContextHierarchy.class); assertEquals(3, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesListClassLevel1 = hierarchyAttributes.get(0); debugConfigAttributes(configAttributesListClassLevel1); assertEquals(1, configAttributesListClassLevel1.size()); assertThat(configAttributesListClassLevel1.get(0).getLocations()[0], equalTo("one.xml")); List<ContextConfigurationAttributes> configAttributesListClassLevel2 = hierarchyAttributes.get(1); debugConfigAttributes(configAttributesListClassLevel2); assertEquals(1, configAttributesListClassLevel2.size()); assertArrayEquals(new String[] { "two-A.xml", "two-B.xml" }, configAttributesListClassLevel2.get(0).getLocations()); List<ContextConfigurationAttributes> configAttributesListClassLevel3 = hierarchyAttributes.get(2); debugConfigAttributes(configAttributesListClassLevel3); assertEquals(1, configAttributesListClassLevel3.size()); assertThat(configAttributesListClassLevel3.get(0).getLocations()[0], equalTo("three.xml")); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithSingleLevelContextHierarchiesAndMetaAnnotations() { List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(TestClass3WithSingleLevelContextHierarchyFromMetaAnnotation.class); assertEquals(3, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesListClassLevel1 = hierarchyAttributes.get(0); debugConfigAttributes(configAttributesListClassLevel1); assertEquals(1, configAttributesListClassLevel1.size()); assertThat(configAttributesListClassLevel1.get(0).getLocations()[0], equalTo("A.xml")); assertAttributes(configAttributesListClassLevel1.get(0), TestClass1WithSingleLevelContextHierarchyFromMetaAnnotation.class, new String[] { "A.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); List<ContextConfigurationAttributes> configAttributesListClassLevel2 = hierarchyAttributes.get(1); debugConfigAttributes(configAttributesListClassLevel2); assertEquals(1, configAttributesListClassLevel2.size()); assertArrayEquals(new String[] { "B-one.xml", "B-two.xml" }, configAttributesListClassLevel2.get(0).getLocations()); assertAttributes(configAttributesListClassLevel2.get(0), TestClass2WithSingleLevelContextHierarchyFromMetaAnnotation.class, new String[] { "B-one.xml", "B-two.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); List<ContextConfigurationAttributes> configAttributesListClassLevel3 = hierarchyAttributes.get(2); debugConfigAttributes(configAttributesListClassLevel3); assertEquals(1, configAttributesListClassLevel3.size()); assertThat(configAttributesListClassLevel3.get(0).getLocations()[0], equalTo("C.xml")); assertAttributes(configAttributesListClassLevel3.get(0), TestClass3WithSingleLevelContextHierarchyFromMetaAnnotation.class, new String[] { "C.xml" }, EMPTY_CLASS_ARRAY, ContextLoader.class, true); } private void assertOneTwo(List<List<ContextConfigurationAttributes>> hierarchyAttributes) { assertEquals(2, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesListClassLevel1 = hierarchyAttributes.get(0); List<ContextConfigurationAttributes> configAttributesListClassLevel2 = hierarchyAttributes.get(1); debugConfigAttributes(configAttributesListClassLevel1); debugConfigAttributes(configAttributesListClassLevel2); assertEquals(1, configAttributesListClassLevel1.size()); assertThat(configAttributesListClassLevel1.get(0).getLocations()[0], equalTo("one.xml")); assertEquals(1, configAttributesListClassLevel2.size()); assertThat(configAttributesListClassLevel2.get(0).getLocations()[0], equalTo("two.xml")); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithBareContextConfigurationInSuperclass() { assertOneTwo(resolveContextHierarchyAttributes(TestClass2WithBareContextConfigurationInSuperclass.class)); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithBareContextConfigurationInSubclass() { assertOneTwo(resolveContextHierarchyAttributes(TestClass2WithBareContextConfigurationInSubclass.class)); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithBareMetaContextConfigWithOverridesInSuperclass() { assertOneTwo(resolveContextHierarchyAttributes(TestClass2WithBareMetaContextConfigWithOverridesInSuperclass.class)); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithBareMetaContextConfigWithOverridesInSubclass() { assertOneTwo(resolveContextHierarchyAttributes(TestClass2WithBareMetaContextConfigWithOverridesInSubclass.class)); } @Test public void resolveContextHierarchyAttributesForTestClassHierarchyWithMultiLevelContextHierarchies() { List<List<ContextConfigurationAttributes>> hierarchyAttributes = resolveContextHierarchyAttributes(TestClass3WithMultiLevelContextHierarchy.class); assertEquals(3, hierarchyAttributes.size()); List<ContextConfigurationAttributes> configAttributesListClassLevel1 = hierarchyAttributes.get(0); debugConfigAttributes(configAttributesListClassLevel1); assertEquals(2, configAttributesListClassLevel1.size()); assertThat(configAttributesListClassLevel1.get(0).getLocations()[0], equalTo("1-A.xml")); assertThat(configAttributesListClassLevel1.get(1).getLocations()[0], equalTo("1-B.xml")); List<ContextConfigurationAttributes> configAttributesListClassLevel2 = hierarchyAttributes.get(1); debugConfigAttributes(configAttributesListClassLevel2); assertEquals(2, configAttributesListClassLevel2.size()); assertThat(configAttributesListClassLevel2.get(0).getLocations()[0], equalTo("2-A.xml")); assertThat(configAttributesListClassLevel2.get(1).getLocations()[0], equalTo("2-B.xml")); List<ContextConfigurationAttributes> configAttributesListClassLevel3 = hierarchyAttributes.get(2); debugConfigAttributes(configAttributesListClassLevel3); assertEquals(3, configAttributesListClassLevel3.size()); assertThat(configAttributesListClassLevel3.get(0).getLocations()[0], equalTo("3-A.xml")); assertThat(configAttributesListClassLevel3.get(1).getLocations()[0], equalTo("3-B.xml")); assertThat(configAttributesListClassLevel3.get(2).getLocations()[0], equalTo("3-C.xml")); } @Test public void buildContextHierarchyMapForTestClassHierarchyWithMultiLevelContextHierarchies() { Map<String, List<ContextConfigurationAttributes>> map = buildContextHierarchyMap(TestClass3WithMultiLevelContextHierarchy.class); assertThat(map.size(), is(3)); assertThat(map.keySet(), hasItems("alpha", "beta", "gamma")); List<ContextConfigurationAttributes> alphaConfig = map.get("alpha"); assertThat(alphaConfig.size(), is(3)); assertThat(alphaConfig.get(0).getLocations()[0], is("1-A.xml")); assertThat(alphaConfig.get(1).getLocations()[0], is("2-A.xml")); assertThat(alphaConfig.get(2).getLocations()[0], is("3-A.xml")); List<ContextConfigurationAttributes> betaConfig = map.get("beta"); assertThat(betaConfig.size(), is(3)); assertThat(betaConfig.get(0).getLocations()[0], is("1-B.xml")); assertThat(betaConfig.get(1).getLocations()[0], is("2-B.xml")); assertThat(betaConfig.get(2).getLocations()[0], is("3-B.xml")); List<ContextConfigurationAttributes> gammaConfig = map.get("gamma"); assertThat(gammaConfig.size(), is(1)); assertThat(gammaConfig.get(0).getLocations()[0], is("3-C.xml")); } @Test public void buildContextHierarchyMapForTestClassHierarchyWithMultiLevelContextHierarchiesAndUnnamedConfig() { Map<String, List<ContextConfigurationAttributes>> map = buildContextHierarchyMap(TestClass3WithMultiLevelContextHierarchyAndUnnamedConfig.class); String level1 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 1; String level2 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 2; String level3 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 3; String level4 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 4; String level5 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 5; String level6 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 6; String level7 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 7; assertThat(map.size(), is(7)); assertThat(map.keySet(), hasItems(level1, level2, level3, level4, level5, level6, level7)); List<ContextConfigurationAttributes> level1Config = map.get(level1); assertThat(level1Config.size(), is(1)); assertThat(level1Config.get(0).getLocations()[0], is("1-A.xml")); List<ContextConfigurationAttributes> level2Config = map.get(level2); assertThat(level2Config.size(), is(1)); assertThat(level2Config.get(0).getLocations()[0], is("1-B.xml")); List<ContextConfigurationAttributes> level3Config = map.get(level3); assertThat(level3Config.size(), is(1)); assertThat(level3Config.get(0).getLocations()[0], is("2-A.xml")); // ... List<ContextConfigurationAttributes> level7Config = map.get(level7); assertThat(level7Config.size(), is(1)); assertThat(level7Config.get(0).getLocations()[0], is("3-C.xml")); } @Test public void buildContextHierarchyMapForTestClassHierarchyWithMultiLevelContextHierarchiesAndPartiallyNamedConfig() { Map<String, List<ContextConfigurationAttributes>> map = buildContextHierarchyMap(TestClass2WithMultiLevelContextHierarchyAndPartiallyNamedConfig.class); String level1 = "parent"; String level2 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 2; String level3 = GENERATED_CONTEXT_HIERARCHY_LEVEL_PREFIX + 3; assertThat(map.size(), is(3)); assertThat(map.keySet(), hasItems(level1, level2, level3)); Iterator<String> levels = map.keySet().iterator(); assertThat(levels.next(), is(level1)); assertThat(levels.next(), is(level2)); assertThat(levels.next(), is(level3)); List<ContextConfigurationAttributes> level1Config = map.get(level1); assertThat(level1Config.size(), is(2)); assertThat(level1Config.get(0).getLocations()[0], is("1-A.xml")); assertThat(level1Config.get(1).getLocations()[0], is("2-A.xml")); List<ContextConfigurationAttributes> level2Config = map.get(level2); assertThat(level2Config.size(), is(1)); assertThat(level2Config.get(0).getLocations()[0], is("1-B.xml")); List<ContextConfigurationAttributes> level3Config = map.get(level3); assertThat(level3Config.size(), is(1)); assertThat(level3Config.get(0).getLocations()[0], is("2-C.xml")); } private void assertContextConfigEntriesAreNotUnique(Class<?> testClass) { try { buildContextHierarchyMap(testClass); fail("Should throw an IllegalStateException"); } catch (IllegalStateException e) { String msg = String.format( "The @ContextConfiguration elements configured via @ContextHierarchy in test class [%s] and its superclasses must define unique contexts per hierarchy level.", testClass.getName()); assertEquals(msg, e.getMessage()); } } @Test public void buildContextHierarchyMapForSingleTestClassWithMultiLevelContextHierarchyWithEmptyContextConfig() { assertContextConfigEntriesAreNotUnique(SingleTestClassWithMultiLevelContextHierarchyWithEmptyContextConfig.class); } @Test public void buildContextHierarchyMapForSingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig() { assertContextConfigEntriesAreNotUnique(SingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig.class); } /** * Used to reproduce bug reported in https://jira.spring.io/browse/SPR-10997 */ @Test public void buildContextHierarchyMapForTestClassHierarchyWithMultiLevelContextHierarchiesAndOverriddenInitializers() { Map<String, List<ContextConfigurationAttributes>> map = buildContextHierarchyMap(TestClass2WithMultiLevelContextHierarchyWithOverriddenInitializers.class); assertThat(map.size(), is(2)); assertThat(map.keySet(), hasItems("alpha", "beta")); List<ContextConfigurationAttributes> alphaConfig = map.get("alpha"); assertThat(alphaConfig.size(), is(2)); assertThat(alphaConfig.get(0).getLocations().length, is(1)); assertThat(alphaConfig.get(0).getLocations()[0], is("1-A.xml")); assertThat(alphaConfig.get(0).getInitializers().length, is(0)); assertThat(alphaConfig.get(1).getLocations().length, is(0)); assertThat(alphaConfig.get(1).getInitializers().length, is(1)); assertEquals(DummyApplicationContextInitializer.class, alphaConfig.get(1).getInitializers()[0]); List<ContextConfigurationAttributes> betaConfig = map.get("beta"); assertThat(betaConfig.size(), is(2)); assertThat(betaConfig.get(0).getLocations().length, is(1)); assertThat(betaConfig.get(0).getLocations()[0], is("1-B.xml")); assertThat(betaConfig.get(0).getInitializers().length, is(0)); assertThat(betaConfig.get(1).getLocations().length, is(0)); assertThat(betaConfig.get(1).getInitializers().length, is(1)); assertEquals(DummyApplicationContextInitializer.class, betaConfig.get(1).getInitializers()[0]); } // ------------------------------------------------------------------------- @ContextConfiguration("foo.xml") @ContextHierarchy(@ContextConfiguration("bar.xml")) private static class SingleTestClassWithContextConfigurationAndContextHierarchy { } @ContextConfiguration("foo.xml") @ContextHierarchy(@ContextConfiguration("bar.xml")) @Retention(RetentionPolicy.RUNTIME) private static @interface ContextConfigurationAndContextHierarchyOnSingleMeta { } @ContextConfigurationAndContextHierarchyOnSingleMeta private static class SingleTestClassWithContextConfigurationAndContextHierarchyOnSingleMetaAnnotation { } @ContextHierarchy(@ContextConfiguration("A.xml")) private static class SingleTestClassWithSingleLevelContextHierarchy { } @ContextHierarchy({// // @ContextConfiguration("A.xml"),// @ContextConfiguration("B.xml"),// @ContextConfiguration("C.xml") // }) private static class SingleTestClassWithTripleLevelContextHierarchy { } @ContextHierarchy(@ContextConfiguration("one.xml")) private static class TestClass1WithSingleLevelContextHierarchy { } @ContextHierarchy(@ContextConfiguration({ "two-A.xml", "two-B.xml" })) private static class TestClass2WithSingleLevelContextHierarchy extends TestClass1WithSingleLevelContextHierarchy { } @ContextHierarchy(@ContextConfiguration("three.xml")) private static class TestClass3WithSingleLevelContextHierarchy extends TestClass2WithSingleLevelContextHierarchy { } @ContextConfiguration("one.xml") private static class TestClass1WithBareContextConfigurationInSuperclass { } @ContextHierarchy(@ContextConfiguration("two.xml")) private static class TestClass2WithBareContextConfigurationInSuperclass extends TestClass1WithBareContextConfigurationInSuperclass { } @ContextHierarchy(@ContextConfiguration("one.xml")) private static class TestClass1WithBareContextConfigurationInSubclass { } @ContextConfiguration("two.xml") private static class TestClass2WithBareContextConfigurationInSubclass extends TestClass1WithBareContextConfigurationInSubclass { } @ContextHierarchy({// // @ContextConfiguration(locations = "1-A.xml", name = "alpha"),// @ContextConfiguration(locations = "1-B.xml", name = "beta") // }) private static class TestClass1WithMultiLevelContextHierarchy { } @ContextHierarchy({// // @ContextConfiguration(locations = "2-A.xml", name = "alpha"),// @ContextConfiguration(locations = "2-B.xml", name = "beta") // }) private static class TestClass2WithMultiLevelContextHierarchy extends TestClass1WithMultiLevelContextHierarchy { } @ContextHierarchy({// // @ContextConfiguration(locations = "3-A.xml", name = "alpha"),// @ContextConfiguration(locations = "3-B.xml", name = "beta"),// @ContextConfiguration(locations = "3-C.xml", name = "gamma") // }) private static class TestClass3WithMultiLevelContextHierarchy extends TestClass2WithMultiLevelContextHierarchy { } @ContextHierarchy({// // @ContextConfiguration(locations = "1-A.xml"),// @ContextConfiguration(locations = "1-B.xml") // }) private static class TestClass1WithMultiLevelContextHierarchyAndUnnamedConfig { } @ContextHierarchy({// // @ContextConfiguration(locations = "2-A.xml"),// @ContextConfiguration(locations = "2-B.xml") // }) private static class TestClass2WithMultiLevelContextHierarchyAndUnnamedConfig extends TestClass1WithMultiLevelContextHierarchyAndUnnamedConfig { } @ContextHierarchy({// // @ContextConfiguration(locations = "3-A.xml"),// @ContextConfiguration(locations = "3-B.xml"),// @ContextConfiguration(locations = "3-C.xml") // }) private static class TestClass3WithMultiLevelContextHierarchyAndUnnamedConfig extends TestClass2WithMultiLevelContextHierarchyAndUnnamedConfig { } @ContextHierarchy({// // @ContextConfiguration(locations = "1-A.xml", name = "parent"),// @ContextConfiguration(locations = "1-B.xml") // }) private static class TestClass1WithMultiLevelContextHierarchyAndPartiallyNamedConfig { } @ContextHierarchy({// // @ContextConfiguration(locations = "2-A.xml", name = "parent"),// @ContextConfiguration(locations = "2-C.xml") // }) private static class TestClass2WithMultiLevelContextHierarchyAndPartiallyNamedConfig extends TestClass1WithMultiLevelContextHierarchyAndPartiallyNamedConfig { } @ContextHierarchy({ // @ContextConfiguration,// @ContextConfiguration // }) private static class SingleTestClassWithMultiLevelContextHierarchyWithEmptyContextConfig { } @ContextHierarchy({ // @ContextConfiguration("foo.xml"),// @ContextConfiguration(classes = BarConfig.class),// duplicate! @ContextConfiguration("baz.xml"),// @ContextConfiguration(classes = BarConfig.class),// duplicate! @ContextConfiguration(loader = AnnotationConfigContextLoader.class) // }) private static class SingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig { } /** * Used to reproduce bug reported in https://jira.spring.io/browse/SPR-10997 */ @ContextHierarchy({// // @ContextConfiguration(name = "alpha", locations = "1-A.xml"),// @ContextConfiguration(name = "beta", locations = "1-B.xml") // }) private static class TestClass1WithMultiLevelContextHierarchyWithUniqueContextConfig { } /** * Used to reproduce bug reported in https://jira.spring.io/browse/SPR-10997 */ @ContextHierarchy({// // @ContextConfiguration(name = "alpha", initializers = DummyApplicationContextInitializer.class),// @ContextConfiguration(name = "beta", initializers = DummyApplicationContextInitializer.class) // }) private static class TestClass2WithMultiLevelContextHierarchyWithOverriddenInitializers extends TestClass1WithMultiLevelContextHierarchyWithUniqueContextConfig { } /** * Used to reproduce bug reported in https://jira.spring.io/browse/SPR-10997 */ private static class DummyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { /* no-op */ } } // ------------------------------------------------------------------------- @ContextHierarchy(@ContextConfiguration("A.xml")) @Retention(RetentionPolicy.RUNTIME) private static @interface ContextHierarchyA { } @ContextHierarchy(@ContextConfiguration({ "B-one.xml", "B-two.xml" })) @Retention(RetentionPolicy.RUNTIME) private static @interface ContextHierarchyB { } @ContextHierarchy(@ContextConfiguration("C.xml")) @Retention(RetentionPolicy.RUNTIME) private static @interface ContextHierarchyC { } @ContextHierarchyA private static class SingleTestClassWithSingleLevelContextHierarchyFromMetaAnnotation { } @ContextHierarchyA private static class TestClass1WithSingleLevelContextHierarchyFromMetaAnnotation { } @ContextHierarchyB private static class TestClass2WithSingleLevelContextHierarchyFromMetaAnnotation extends TestClass1WithSingleLevelContextHierarchyFromMetaAnnotation { } @ContextHierarchyC private static class TestClass3WithSingleLevelContextHierarchyFromMetaAnnotation extends TestClass2WithSingleLevelContextHierarchyFromMetaAnnotation { } // ------------------------------------------------------------------------- @ContextConfiguration @Retention(RetentionPolicy.RUNTIME) private static @interface ContextConfigWithOverrides { String[] locations() default "A.xml"; } @ContextConfigWithOverrides(locations = "one.xml") private static class TestClass1WithBareMetaContextConfigWithOverridesInSuperclass { } @ContextHierarchy(@ContextConfiguration(locations = "two.xml")) private static class TestClass2WithBareMetaContextConfigWithOverridesInSuperclass extends TestClass1WithBareMetaContextConfigWithOverridesInSuperclass { } @ContextHierarchy(@ContextConfiguration(locations = "one.xml")) private static class TestClass1WithBareMetaContextConfigWithOverridesInSubclass { } @ContextConfigWithOverrides(locations = "two.xml") private static class TestClass2WithBareMetaContextConfigWithOverridesInSubclass extends TestClass1WithBareMetaContextConfigWithOverridesInSubclass { } }