Assert context uniqueness against merged config

Prior to this commit, the uniqueness check for @ContextConfiguration
attributes within a @ContextHierarchy was performed at a single test
class level instead of against the merged configuration for all test
class levels in the test class hierarchy.

This commit addresses this issue by moving the uniqueness check
algorithm from resolveContextHierarchyAttributes() to
buildContextHierarchyMap() within ContextLoaderUtils.

Issue: SPR-10997
This commit is contained in:
Sam Brannen
2013-10-21 19:33:04 +02:00
parent 686cd79bdd
commit 7658d856ca
2 changed files with 105 additions and 38 deletions

View File

@@ -21,6 +21,8 @@ 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.support.AnnotationConfigContextLoader;
import static org.hamcrest.CoreMatchers.*;
@@ -152,29 +154,6 @@ public class ContextLoaderUtilsContextHierarchyTests extends AbstractContextLoad
assertThat(configAttributesListClassLevel3.get(2).getLocations()[0], equalTo("3-C.xml"));
}
private void assertContextConfigEntriesAreNotUnique(Class<?> testClass) {
try {
resolveContextHierarchyAttributes(testClass);
fail("Should throw an IllegalStateException");
}
catch (IllegalStateException e) {
String msg = String.format(
"The @ContextConfiguration elements configured via @ContextHierarchy in test class [%s] must define unique contexts to load.",
testClass.getName());
assertEquals(msg, e.getMessage());
}
}
@Test
public void resolveContextHierarchyAttributesForSingleTestClassWithMultiLevelContextHierarchyWithEmptyContextConfig() {
assertContextConfigEntriesAreNotUnique(SingleTestClassWithMultiLevelContextHierarchyWithEmptyContextConfig.class);
}
@Test
public void resolveContextHierarchyAttributesForSingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig() {
assertContextConfigEntriesAreNotUnique(SingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig.class);
}
@Test
public void buildContextHierarchyMapForTestClassHierarchyWithMultiLevelContextHierarchies() {
Map<String, List<ContextConfigurationAttributes>> map = buildContextHierarchyMap(TestClass3WithMultiLevelContextHierarchy.class);
@@ -262,6 +241,58 @@ public class ContextLoaderUtilsContextHierarchyTests extends AbstractContextLoad
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.springsource.org/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]);
}
// -------------------------------------------------------------------------
@@ -401,4 +432,40 @@ public class ContextLoaderUtilsContextHierarchyTests extends AbstractContextLoad
private static class SingleTestClassWithMultiLevelContextHierarchyWithDuplicatedContextConfig {
}
/**
* Used to reproduce bug reported in https://jira.springsource.org/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.springsource.org/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.springsource.org/browse/SPR-10997
*/
private static class DummyApplicationContextInitializer implements
ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
/* no-op */
}
}
}