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) {
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,

View File

@ -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 {