diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java index d3fa761afd..438b9d7a38 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java @@ -17,6 +17,7 @@ package org.springframework.test.context.aot; import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -178,18 +179,27 @@ public class TestContextAotGenerator { MultiValueMap> mergedConfigMappings = new LinkedMultiValueMap<>(); ClassLoader classLoader = getClass().getClassLoader(); + Set visitedTestClassNames = new HashSet<>(); testClasses.forEach(testClass -> { - MergedContextConfiguration mergedConfig = buildMergedContextConfiguration(testClass); - mergedConfigMappings.add(mergedConfig, testClass); - collectRuntimeHintsRegistrarClasses(testClass, coreRuntimeHintsRegistrarClasses); - reflectiveRuntimeHintsRegistrar.registerRuntimeHints(this.runtimeHints, testClass); - this.testRuntimeHintsRegistrars.forEach(registrar -> { - if (logger.isTraceEnabled()) { - logger.trace("Processing RuntimeHints contribution from class [%s]" - .formatted(registrar.getClass().getCanonicalName())); + String testClassName = testClass.getName(); + if (visitedTestClassNames.add(testClassName)) { + MergedContextConfiguration mergedConfig = buildMergedContextConfiguration(testClass); + mergedConfigMappings.add(mergedConfig, testClass); + collectRuntimeHintsRegistrarClasses(testClass, coreRuntimeHintsRegistrarClasses); + reflectiveRuntimeHintsRegistrar.registerRuntimeHints(this.runtimeHints, testClass); + this.testRuntimeHintsRegistrars.forEach(registrar -> { + if (logger.isTraceEnabled()) { + logger.trace("Processing RuntimeHints contribution from class [%s]" + .formatted(registrar.getClass().getCanonicalName())); + } + registrar.registerHints(this.runtimeHints, testClass, classLoader); + }); + } + else { + if (logger.isDebugEnabled()) { + logger.debug("Skipping duplicate test class: " + testClassName); } - registrar.registerHints(this.runtimeHints, testClass, classLoader); - }); + } }); coreRuntimeHintsRegistrarClasses.stream()