19
19
import static org .junit .platform .commons .support .ReflectionSupport .findMethods ;
20
20
import static org .junit .platform .commons .support .ReflectionSupport .streamNestedClasses ;
21
21
import static org .junit .platform .commons .util .FunctionUtils .where ;
22
+ import static org .junit .platform .commons .util .ReflectionUtils .isInnerClass ;
22
23
import static org .junit .platform .engine .discovery .DiscoverySelectors .selectUniqueId ;
23
24
import static org .junit .platform .engine .support .discovery .SelectorResolver .Resolution .unresolved ;
24
25
44
45
import org .junit .jupiter .engine .descriptor .TestClassAware ;
45
46
import org .junit .jupiter .engine .discovery .predicates .TestClassPredicates ;
46
47
import org .junit .platform .commons .support .ReflectionSupport ;
48
+ import org .junit .platform .commons .util .ReflectionUtils ;
49
+ import org .junit .platform .engine .DiscoveryIssue ;
50
+ import org .junit .platform .engine .DiscoveryIssue .Severity ;
47
51
import org .junit .platform .engine .DiscoverySelector ;
48
52
import org .junit .platform .engine .TestDescriptor ;
49
53
import org .junit .platform .engine .UniqueId ;
52
56
import org .junit .platform .engine .discovery .IterationSelector ;
53
57
import org .junit .platform .engine .discovery .NestedClassSelector ;
54
58
import org .junit .platform .engine .discovery .UniqueIdSelector ;
59
+ import org .junit .platform .engine .support .descriptor .ClassSource ;
55
60
import org .junit .platform .engine .support .discovery .DiscoveryIssueReporter ;
56
61
import org .junit .platform .engine .support .discovery .SelectorResolver ;
57
62
@@ -63,12 +68,14 @@ class ClassSelectorResolver implements SelectorResolver {
63
68
private final Predicate <String > classNameFilter ;
64
69
private final JupiterConfiguration configuration ;
65
70
private final TestClassPredicates predicates ;
71
+ private final DiscoveryIssueReporter issueReporter ;
66
72
67
73
ClassSelectorResolver (Predicate <String > classNameFilter , JupiterConfiguration configuration ,
68
74
DiscoveryIssueReporter issueReporter ) {
69
75
this .classNameFilter = classNameFilter ;
70
76
this .configuration = configuration ;
71
77
this .predicates = new TestClassPredicates (issueReporter );
78
+ this .issueReporter = issueReporter ;
72
79
}
73
80
74
81
@ Override
@@ -98,9 +105,19 @@ private boolean isAcceptedStandaloneTestClass(Class<?> testClass) {
98
105
99
106
@ Override
100
107
public Resolution resolve (NestedClassSelector selector , Context context ) {
101
- if (this .predicates .isAnnotatedWithNestedAndValid .test (selector .getNestedClass ())) {
102
- return toResolution (context .addToParent (() -> selectClass (selector .getEnclosingClasses ()),
103
- parent -> Optional .of (newMemberClassTestDescriptor (parent , selector .getNestedClass ()))));
108
+ Class <?> nestedClass = selector .getNestedClass ();
109
+ if (this .predicates .isAnnotatedWithNested .test (nestedClass )) {
110
+ if (this .predicates .isValidNestedTestClass (nestedClass )) {
111
+ return toResolution (context .addToParent (() -> selectClass (selector .getEnclosingClasses ()),
112
+ parent -> Optional .of (newMemberClassTestDescriptor (parent , nestedClass ))));
113
+ }
114
+ }
115
+ else if (isInnerClass (nestedClass ) && predicates .looksLikeIntendedTestClass (nestedClass )) {
116
+ String message = String .format (
117
+ "Inner class '%s' looks like it was intended to be a test class but will not be executed. It must be static or annotated with @Nested." ,
118
+ nestedClass .getName ());
119
+ issueReporter .reportIssue (DiscoveryIssue .builder (Severity .WARNING , message ) //
120
+ .source (ClassSource .from (nestedClass )));
104
121
}
105
122
return unresolved ();
106
123
}
@@ -278,7 +295,7 @@ private Supplier<Set<? extends DiscoverySelector>> expansionCallback(TestDescrip
278
295
this .predicates .isTestOrTestFactoryOrTestTemplateMethod , TOP_DOWN ).stream () //
279
296
.map (method -> selectMethod (testClasses , method ));
280
297
Stream <NestedClassSelector > nestedClasses = streamNestedClasses (testClass ,
281
- this .predicates .isAnnotatedWithNestedAndValid ) //
298
+ this .predicates .isAnnotatedWithNested . or ( ReflectionUtils :: isInnerClass ) ) //
282
299
.map (nestedClass -> DiscoverySelectors .selectNestedClass (testClasses , nestedClass ));
283
300
return Stream .concat (methods , nestedClasses ).collect (
284
301
toCollection ((Supplier <Set <DiscoverySelector >>) LinkedHashSet ::new ));
0 commit comments