2020import static org .junit .platform .commons .util .ReflectionUtils .isNestedClassPresent ;
2121
2222import java .lang .reflect .Method ;
23+ import java .util .HashSet ;
24+ import java .util .Set ;
2325import java .util .function .Predicate ;
2426
2527import org .apiguardian .api .API ;
@@ -65,9 +67,16 @@ public TestClassPredicates(DiscoveryIssueReporter issueReporter) {
6567 }
6668
6769 public boolean looksLikeIntendedTestClass (Class <?> candidate ) {
68- return this .isAnnotatedWithClassTemplate .test (candidate ) //
69- || hasTestOrTestFactoryOrTestTemplateMethods (candidate ) //
70- || hasNestedTests (candidate );
70+ return looksLikeIntendedTestClass (candidate , new HashSet <>());
71+ }
72+
73+ private boolean looksLikeIntendedTestClass (Class <?> candidate , Set <Class <?>> seen ) {
74+ if (seen .add (candidate )) {
75+ return this .isAnnotatedWithClassTemplate .test (candidate ) //
76+ || hasTestOrTestFactoryOrTestTemplateMethods (candidate ) //
77+ || hasNestedTests (candidate , seen );
78+ }
79+ return false ;
7180 }
7281
7382 public boolean isValidNestedTestClass (Class <?> candidate ) {
@@ -84,11 +93,11 @@ private boolean hasTestOrTestFactoryOrTestTemplateMethods(Class<?> candidate) {
8493 return isMethodPresent (candidate , this .isTestOrTestFactoryOrTestTemplateMethod );
8594 }
8695
87- private boolean hasNestedTests (Class <?> candidate ) {
96+ private boolean hasNestedTests (Class <?> candidate , Set < Class <?>> seen ) {
8897 return isNestedClassPresent ( //
8998 candidate , //
9099 isNotSame (candidate ).and (
91- this .isAnnotatedWithNested .or (it -> isInnerClass (it ) && looksLikeIntendedTestClass (it ))));
100+ this .isAnnotatedWithNested .or (it -> isInnerClass (it ) && looksLikeIntendedTestClass (it , seen ))));
92101 }
93102
94103 private static Predicate <Class <?>> isNotSame (Class <?> candidate ) {
0 commit comments