From 72e4a5f9fea49d2dd09911ae87f2fa5f795943e2 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 15 Jul 2022 17:10:47 +0200 Subject: [PATCH] Fix precondition check in TestClassScanner and improve Javadoc - remove not-empty precondition check for packageNames so that the core scan() method can actually be used. - document constructor - document use case for packageNames - add test that scan's all test classes in the spring-test project - reduce logging due to the previous action item See gh-28824 --- .../test/context/aot/TestClassScanner.java | 12 +++++++++++- .../test/context/aot/TestClassScannerTests.java | 17 ++++++++++++++--- spring-test/src/test/resources/log4j2-test.xml | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java index ea34827cea..865d7f0a90 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestClassScanner.java @@ -94,6 +94,13 @@ class TestClassScanner { private final Set classpathRoots; + /** + * Create a {@code TestClassScanner} for the given classpath roots. + *

For example, in a Gradle project that only supports Java-based tests, + * the supplied set would contain a single {@link Path} representing the + * absolute path to the project's {@code build/classes/java/test} folder. + * @param classpathRoots the classpath roots to scan + */ TestClassScanner(Set classpathRoots) { Assert.notEmpty(classpathRoots, "'classpathRoots' must not be null or empty"); Assert.noNullElements(classpathRoots, "'classpathRoots' must not contain null elements"); @@ -111,9 +118,12 @@ class TestClassScanner { /** * Scan the configured classpath roots for Spring integration test classes * in the given packages. + *

This method is currently only intended to be used within our own test + * suite to validate the behavior of this scanner with a limited scope. In + * production scenarios one should invoke {@link #scan()} to scan all packages + * in the configured classpath roots. */ Stream> scan(String... packageNames) { - Assert.notEmpty(packageNames, "'packageNames' must not be null or empty"); Assert.noNullElements(packageNames, "'packageNames' must not contain null elements"); if (logger.isInfoEnabled()) { diff --git a/spring-test/src/test/java/org/springframework/test/context/aot/TestClassScannerTests.java b/spring-test/src/test/java/org/springframework/test/context/aot/TestClassScannerTests.java index 242467c37f..69e4bc06a0 100644 --- a/spring-test/src/test/java/org/springframework/test/context/aot/TestClassScannerTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/aot/TestClassScannerTests.java @@ -87,11 +87,22 @@ class TestClassScannerTests { ); } + @Test + void scanEntireSpringTestModule() { + assertThat(scan()).hasSizeGreaterThan(400); + } + + private Stream> scan() { + return new TestClassScanner(classpathRoots()).scan(); + } + private Stream> scan(String... packageNames) { + return new TestClassScanner(classpathRoots()).scan(packageNames); + } + + private Set classpathRoots() { try { - Set classpathRoots = Set.of( - Paths.get(getClass().getProtectionDomain().getCodeSource().getLocation().toURI())); - return new TestClassScanner(classpathRoots).scan(packageNames); + return Set.of(Paths.get(getClass().getProtectionDomain().getCodeSource().getLocation().toURI())); } catch (Exception ex) { throw new RuntimeException(ex); diff --git a/spring-test/src/test/resources/log4j2-test.xml b/spring-test/src/test/resources/log4j2-test.xml index 8fc877aff3..d7f8b2b177 100644 --- a/spring-test/src/test/resources/log4j2-test.xml +++ b/spring-test/src/test/resources/log4j2-test.xml @@ -14,7 +14,7 @@ - +