diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java index 3bde1c73875..c21e343bc05 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java @@ -149,6 +149,8 @@ public class SpringBootContextLoader extends AbstractContextLoader implements Ao if (useMainMethod == UseMainMethod.NEVER) { return null; } + Assert.state(mergedConfig.getParent() == null, + () -> "UseMainMethod.%s cannot be used with @ContextHierarchy tests".formatted(useMainMethod)); Class springBootConfiguration = Arrays.stream(mergedConfig.getClasses()) .filter(this::isSpringBootConfiguration).findFirst().orElse(null); Assert.state(springBootConfiguration != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE, diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java index 70c4dd0c845..9a4a2b21099 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderTests.java @@ -39,6 +39,8 @@ import org.springframework.core.env.PropertySource; import org.springframework.core.env.StandardEnvironment; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ApplicationContextFailureProcessor; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.ContextHierarchy; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContext; import org.springframework.test.context.TestContextManager; @@ -232,6 +234,14 @@ class SpringBootContextLoaderTests { assertThat(ContextLoaderApplicationContextFailureProcessor.failedContext).isNotNull(); } + @Test + void whenUseMainMethodWithContextHierarchyThrowsException() { + TestContext testContext = new ExposedTestContextManager(UseMainMethodWithContextHierarchy.class) + .getExposedTestContext(); + assertThatIllegalStateException().isThrownBy(testContext::getApplicationContext).havingCause() + .withMessage("UseMainMethod.ALWAYS cannot be used with @ContextHierarchy tests"); + } + private String[] getActiveProfiles(Class testClass) { TestContext testContext = new ExposedTestContextManager(testClass).getExposedTestContext(); ApplicationContext applicationContext = testContext.getApplicationContext(); @@ -349,6 +359,13 @@ class SpringBootContextLoaderTests { } + @SpringBootTest(useMainMethod = UseMainMethod.ALWAYS) + @ContextHierarchy({ @ContextConfiguration(classes = ConfigWithMain.class), + @ContextConfiguration(classes = AnotherConfigWithMain.class) }) + static class UseMainMethodWithContextHierarchy { + + } + @Configuration(proxyBeanMethods = false) static class Config { @@ -363,6 +380,15 @@ class SpringBootContextLoaderTests { } + @SpringBootConfiguration(proxyBeanMethods = false) + public static class AnotherConfigWithMain { + + public static void main(String[] args) { + new SpringApplication(AnotherConfigWithMain.class).run("--spring.profiles.active=anotherfrommain"); + } + + } + @SpringBootConfiguration(proxyBeanMethods = false) static class ConfigWithNoMain {