Merge branch '3.3.x' into 3.4.x

Closes gh-44481
This commit is contained in:
Stéphane Nicoll
2025-02-28 11:10:31 +01:00
3 changed files with 91 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2024 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,10 +25,16 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import org.springframework.aot.test.generate.TestGenerationContext;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.ApplicationContextFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootContextLoader.MainMethodBeanFactoryInitializationAotProcessor;
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext;
@@ -248,6 +254,35 @@ class SpringBootContextLoaderTests {
.withMessage("UseMainMethod.ALWAYS cannot be used with @ContextHierarchy tests");
}
@Test
void whenMainMethodPresentRegisterReflectionHints() {
TestContext testContext = new ExposedTestContextManager(UseMainMethodWhenAvailableAndNoMainMethod.class)
.getExposedTestContext();
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) testContext
.getApplicationContext()
.getAutowireCapableBeanFactory();
BeanFactoryInitializationAotContribution aotContribution = new MainMethodBeanFactoryInitializationAotProcessor()
.processAheadOfTime(beanFactory);
assertThat(aotContribution).isNull();
}
@Test
void whenMainMethodNotAvailableReturnsNoAotContribution() {
TestContext testContext = new ExposedTestContextManager(UseMainMethodWhenAvailableAndMainMethod.class)
.getExposedTestContext();
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) testContext
.getApplicationContext()
.getAutowireCapableBeanFactory();
BeanFactoryInitializationAotContribution aotContribution = new MainMethodBeanFactoryInitializationAotProcessor()
.processAheadOfTime(beanFactory);
assertThat(aotContribution).isNotNull();
TestGenerationContext generationContext = new TestGenerationContext();
aotContribution.applyTo(generationContext, null);
RuntimeHints runtimeHints = generationContext.getRuntimeHints();
assertThat(RuntimeHintsPredicates.reflection().onMethod(ConfigWithMain.class, "main").invoke())
.accepts(runtimeHints);
}
@Test
void whenSubclassProvidesCustomApplicationContextFactory() {
TestContext testContext = new ExposedTestContextManager(CustomApplicationContextTest.class)