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 a6f0eef506ce..f521e0b815ce 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 @@ -135,7 +135,7 @@ protected ContextLoader resolveContextLoader(Class testClass, } private void addConfigAttributesClasses(ContextConfigurationAttributes configAttributes, Class[] classes) { - List> combined = new ArrayList<>(Arrays.asList(classes)); + Set> combined = new LinkedHashSet<>(Arrays.asList(classes)); if (configAttributes.getClasses() != null) { combined.addAll(Arrays.asList(configAttributes.getClasses())); } diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/bootstrap/SpringBootTestContextBootstrapperTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/bootstrap/SpringBootTestContextBootstrapperTests.java index a2e8513954f2..dc203560949b 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/bootstrap/SpringBootTestContextBootstrapperTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/bootstrap/SpringBootTestContextBootstrapperTests.java @@ -23,6 +23,7 @@ import org.springframework.boot.test.context.SpringBootTestContextBootstrapper; import org.springframework.test.context.BootstrapContext; import org.springframework.test.context.CacheAwareContextLoaderDelegate; +import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContext; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.util.ReflectionTestUtils; @@ -56,39 +57,47 @@ void springBootTestWithAMockWebEnvironmentCanBeUsedWithWebAppConfiguration() { @Test void mergedContextConfigurationWhenArgsDifferentShouldNotBeConsideredEqual() { TestContext context = buildTestContext(SpringBootTestArgsConfiguration.class); - Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration"); + MergedContextConfiguration contextConfiguration = getMergedContextConfiguration(context); TestContext otherContext2 = buildTestContext(SpringBootTestOtherArgsConfiguration.class); - Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext2, "mergedContextConfiguration"); + MergedContextConfiguration otherContextConfiguration = getMergedContextConfiguration(otherContext2); assertThat(contextConfiguration).isNotEqualTo(otherContextConfiguration); } @Test void mergedContextConfigurationWhenArgsSameShouldBeConsideredEqual() { TestContext context = buildTestContext(SpringBootTestArgsConfiguration.class); - Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration"); + MergedContextConfiguration contextConfiguration = getMergedContextConfiguration(context); TestContext otherContext2 = buildTestContext(SpringBootTestSameArgsConfiguration.class); - Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext2, "mergedContextConfiguration"); + MergedContextConfiguration otherContextConfiguration = getMergedContextConfiguration(otherContext2); assertThat(contextConfiguration).isEqualTo(otherContextConfiguration); } @Test void mergedContextConfigurationWhenWebEnvironmentsDifferentShouldNotBeConsideredEqual() { TestContext context = buildTestContext(SpringBootTestMockWebEnvironmentConfiguration.class); - Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration"); + MergedContextConfiguration contextConfiguration = getMergedContextConfiguration(context); TestContext otherContext = buildTestContext(SpringBootTestDefinedPortWebEnvironmentConfiguration.class); - Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext, "mergedContextConfiguration"); + MergedContextConfiguration otherContextConfiguration = getMergedContextConfiguration(otherContext); assertThat(contextConfiguration).isNotEqualTo(otherContextConfiguration); } @Test - void mergedContextConfigurationWhenWebEnvironmentsSameShouldtBeConsideredEqual() { + void mergedContextConfigurationWhenWebEnvironmentsSameShouldBeConsideredEqual() { TestContext context = buildTestContext(SpringBootTestMockWebEnvironmentConfiguration.class); - Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration"); + MergedContextConfiguration contextConfiguration = getMergedContextConfiguration(context); TestContext otherContext = buildTestContext(SpringBootTestAnotherMockWebEnvironmentConfiguration.class); - Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext, "mergedContextConfiguration"); + MergedContextConfiguration otherContextConfiguration = getMergedContextConfiguration(otherContext); assertThat(contextConfiguration).isEqualTo(otherContextConfiguration); } + @Test + void mergedContextConfigurationClassesShouldNotContainDuplicates() { + TestContext context = buildTestContext(SpringBootTestClassesConfiguration.class); + MergedContextConfiguration contextConfiguration = getMergedContextConfiguration(context); + Class[] classes = contextConfiguration.getClasses(); + assertThat(classes).containsExactly(SpringBootTestContextBootstrapperExampleConfig.class); + } + @SuppressWarnings("rawtypes") private TestContext buildTestContext(Class testClass) { SpringBootTestContextBootstrapper bootstrapper = new SpringBootTestContextBootstrapper(); @@ -100,6 +109,10 @@ private TestContext buildTestContext(Class testClass) { return bootstrapper.buildTestContext(); } + private MergedContextConfiguration getMergedContextConfiguration(TestContext context) { + return (MergedContextConfiguration) ReflectionTestUtils.getField(context, "mergedContextConfiguration"); + } + @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @WebAppConfiguration static class SpringBootTestNonMockWebEnvironmentAndWebAppConfiguration { @@ -142,4 +155,9 @@ static class SpringBootTestOtherArgsConfiguration { } + @SpringBootTest(classes = SpringBootTestContextBootstrapperExampleConfig.class) + static class SpringBootTestClassesConfiguration { + + } + }