From 0ec603cdada9c1589d29e546cbcd798b2124d776 Mon Sep 17 00:00:00 2001 From: dreis2211 Date: Wed, 16 Dec 2020 19:48:03 +0100 Subject: [PATCH] Avoid duplicates in MergedContextConfiguration Remove duplicate config attribute classes by using a `Set` rather than a `List` in the `SpringBootTestContextBootstrapper`. See gh-24532 --- .../SpringBootTestContextBootstrapper.java | 2 +- ...pringBootTestContextBootstrapperTests.java | 36 ++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) 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 06cf716883..372a08ec3a 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 @@ -134,7 +134,7 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr } 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 a2e8513954..dc20356094 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.SpringBootTest.WebEnvironment; 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 @@ class SpringBootTestContextBootstrapperTests { @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 @@ class SpringBootTestContextBootstrapperTests { 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 @@ class SpringBootTestContextBootstrapperTests { } + @SpringBootTest(classes = SpringBootTestContextBootstrapperExampleConfig.class) + static class SpringBootTestClassesConfiguration { + + } + }