Provide a way to create custom ApplicationContextFactory

Update `SpringBootContextLoader` so that `getApplicationContextFactory`
is now a protected that may be overridden to provide a custom
`ApplicationContextFactory` instance.

Closes gh-38205
This commit is contained in:
Phillip Webb
2023-11-07 11:53:10 -08:00
parent f22c1ba7d6
commit 690cfa220a
2 changed files with 48 additions and 12 deletions

View File

@@ -26,12 +26,14 @@ import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.boot.ApplicationContextFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
@@ -246,6 +248,13 @@ class SpringBootContextLoaderTests {
.withMessage("UseMainMethod.ALWAYS cannot be used with @ContextHierarchy tests");
}
@Test
void whenSubclassProvidesCustomApplicationContextFactory() {
TestContext testContext = new ExposedTestContextManager(CustomApplicationContextTest.class)
.getExposedTestContext();
assertThat(testContext.getApplicationContext()).isInstanceOf(CustomAnnotationConfigApplicationContext.class);
}
private String[] getActiveProfiles(Class<?> testClass) {
TestContext testContext = new ExposedTestContextManager(testClass).getExposedTestContext();
ApplicationContext applicationContext = testContext.getApplicationContext();
@@ -370,6 +379,25 @@ class SpringBootContextLoaderTests {
}
@SpringBootTest
@ContextConfiguration(classes = Config.class, loader = CustomApplicationContextSpringBootContextLoader.class)
static class CustomApplicationContextTest {
}
static class CustomApplicationContextSpringBootContextLoader extends SpringBootContextLoader {
@Override
protected ApplicationContextFactory getApplicationContextFactory(MergedContextConfiguration mergedConfig) {
return (webApplicationType) -> new CustomAnnotationConfigApplicationContext();
}
}
static class CustomAnnotationConfigApplicationContext extends AnnotationConfigApplicationContext {
}
@Configuration(proxyBeanMethods = false)
static class Config {