Ensure @ContextHierarchy is never used with UseMainMethod

Fixes gh-33078
This commit is contained in:
Phillip Webb 2022-11-17 10:16:24 -08:00
parent b9e57c73b5
commit fafbefa35c
2 changed files with 28 additions and 0 deletions

View File

@ -149,6 +149,8 @@ public class SpringBootContextLoader extends AbstractContextLoader implements Ao
if (useMainMethod == UseMainMethod.NEVER) { if (useMainMethod == UseMainMethod.NEVER) {
return null; return null;
} }
Assert.state(mergedConfig.getParent() == null,
() -> "UseMainMethod.%s cannot be used with @ContextHierarchy tests".formatted(useMainMethod));
Class<?> springBootConfiguration = Arrays.stream(mergedConfig.getClasses()) Class<?> springBootConfiguration = Arrays.stream(mergedConfig.getClasses())
.filter(this::isSpringBootConfiguration).findFirst().orElse(null); .filter(this::isSpringBootConfiguration).findFirst().orElse(null);
Assert.state(springBootConfiguration != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE, Assert.state(springBootConfiguration != null || useMainMethod == UseMainMethod.WHEN_AVAILABLE,

View File

@ -39,6 +39,8 @@ import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment; import org.springframework.core.env.StandardEnvironment;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ApplicationContextFailureProcessor; 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.MergedContextConfiguration;
import org.springframework.test.context.TestContext; import org.springframework.test.context.TestContext;
import org.springframework.test.context.TestContextManager; import org.springframework.test.context.TestContextManager;
@ -232,6 +234,14 @@ class SpringBootContextLoaderTests {
assertThat(ContextLoaderApplicationContextFailureProcessor.failedContext).isNotNull(); 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) { private String[] getActiveProfiles(Class<?> testClass) {
TestContext testContext = new ExposedTestContextManager(testClass).getExposedTestContext(); TestContext testContext = new ExposedTestContextManager(testClass).getExposedTestContext();
ApplicationContext applicationContext = testContext.getApplicationContext(); 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) @Configuration(proxyBeanMethods = false)
static class Config { 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) @SpringBootConfiguration(proxyBeanMethods = false)
static class ConfigWithNoMain { static class ConfigWithNoMain {