Register runtime hints for ApplicationContextInitializers in the TCF
This commit introduces automatic registration of runtime hints for ApplicationContextInitializers configured via the `initializers` attribute in @ContextConfiguration. See gh-29021
This commit is contained in:
		
							parent
							
								
									51daeac86b
								
							
						
					
					
						commit
						549f4e7933
					
				|  | @ -112,6 +112,7 @@ public class TestContextAotGenerator { | |||
| 		mergedConfigMappings.forEach((mergedConfig, testClasses) -> { | ||||
| 			logger.debug(LogMessage.format("Generating AOT artifacts for test classes %s", | ||||
| 					testClasses.stream().map(Class::getName).toList())); | ||||
| 			registerHintsForMergedConfig(mergedConfig); | ||||
| 			try { | ||||
| 				// Use first test class discovered for a given unique MergedContextConfiguration. | ||||
| 				Class<?> testClass = testClasses.get(0); | ||||
|  | @ -174,8 +175,6 @@ public class TestContextAotGenerator { | |||
| 				Consider annotating test class [%s] with @ContextConfiguration or \ | ||||
| 				@ContextHierarchy.""".formatted(testClass.getName())); | ||||
| 
 | ||||
| 		registerDeclaredConstructors(contextLoader.getClass()); | ||||
| 
 | ||||
| 		if (contextLoader instanceof AotContextLoader aotContextLoader) { | ||||
| 			try { | ||||
| 				ApplicationContext context = aotContextLoader.loadContextForAotProcessing(mergedConfig); | ||||
|  | @ -227,6 +226,14 @@ public class TestContextAotGenerator { | |||
| 				.registerType(TypeReference.of(className), MemberCategory.INVOKE_PUBLIC_METHODS); | ||||
| 	} | ||||
| 
 | ||||
| 	private void registerHintsForMergedConfig(MergedContextConfiguration mergedConfig) { | ||||
| 		ContextLoader contextLoader = mergedConfig.getContextLoader(); | ||||
| 		if (contextLoader != null) { | ||||
| 			registerDeclaredConstructors(contextLoader.getClass()); | ||||
| 		} | ||||
| 		mergedConfig.getContextInitializerClasses().forEach(this::registerDeclaredConstructors); | ||||
| 	} | ||||
| 
 | ||||
| 	private void registerDeclaredConstructors(Class<?> type) { | ||||
| 		ReflectionHints reflectionHints = this.runtimeHints.reflection(); | ||||
| 		reflectionHints.registerType(type, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); | ||||
|  |  | |||
|  | @ -123,6 +123,7 @@ class TestContextAotGeneratorTests extends AbstractAotTests { | |||
| 		).forEach(type -> assertReflectionRegistered(runtimeHints, type, INVOKE_PUBLIC_CONSTRUCTORS)); | ||||
| 
 | ||||
| 		Set.of( | ||||
| 			org.springframework.test.context.aot.samples.basic.BasicSpringTestNGTests.CustomInitializer.class, | ||||
| 			org.springframework.test.context.support.AnnotationConfigContextLoader.class, | ||||
| 			org.springframework.test.context.support.DefaultTestContextBootstrapper.class, | ||||
| 			org.springframework.test.context.support.DelegatingSmartContextLoader.class, | ||||
|  |  | |||
|  | @ -19,8 +19,11 @@ package org.springframework.test.context.aot.samples.basic; | |||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.ApplicationContext; | ||||
| import org.springframework.context.ApplicationContextInitializer; | ||||
| import org.springframework.context.ConfigurableApplicationContext; | ||||
| import org.springframework.mock.env.MockPropertySource; | ||||
| import org.springframework.test.context.ContextConfiguration; | ||||
| import org.springframework.test.context.TestPropertySource; | ||||
| import org.springframework.test.context.aot.samples.basic.BasicSpringTestNGTests.CustomInitializer; | ||||
| import org.springframework.test.context.aot.samples.common.MessageService; | ||||
| import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; | ||||
| 
 | ||||
|  | @ -30,8 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; | |||
|  * @author Sam Brannen | ||||
|  * @since 6.0 | ||||
|  */ | ||||
| @ContextConfiguration(classes = BasicTestConfiguration.class) | ||||
| @TestPropertySource(properties = "test.engine = testng") | ||||
| @ContextConfiguration(classes = BasicTestConfiguration.class, initializers = CustomInitializer.class) | ||||
| public class BasicSpringTestNGTests extends AbstractTestNGSpringContextTests { | ||||
| 
 | ||||
| 	@Autowired | ||||
|  | @ -51,4 +53,14 @@ public class BasicSpringTestNGTests extends AbstractTestNGSpringContextTests { | |||
| 			.as("@TestPropertySource").isEqualTo("testng"); | ||||
| 	} | ||||
| 
 | ||||
| 	public static class CustomInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void initialize(ConfigurableApplicationContext applicationContext) { | ||||
| 			applicationContext.getEnvironment().getPropertySources() | ||||
| 				.addFirst(new MockPropertySource().withProperty("test.engine", "testng")); | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue