Skip to content

Commit 5297565

Browse files
committed
Report discovery issues for invalid testable methods
1 parent e6c26f7 commit 5297565

File tree

23 files changed

+442
-168
lines changed

23 files changed

+442
-168
lines changed

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/LifecycleMethodUtils.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import static org.junit.platform.commons.support.AnnotationSupport.findAnnotatedMethods;
1414
import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation;
1515
import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList;
16-
import static org.junit.platform.engine.support.discovery.DiscoveryIssueReporter.Condition.allOf;
1716

1817
import java.lang.annotation.Annotation;
1918
import java.lang.reflect.Method;
@@ -88,15 +87,14 @@ static void validateClassTemplateInvocationLifecycleMethodsAreDeclaredCorrectly(
8887
boolean requireStatic, DiscoveryIssueReporter issueReporter) {
8988

9089
findAllClassTemplateInvocationLifecycleMethods(testClass) //
91-
.forEach(allOf( //
92-
isNotPrivateError(issueReporter), //
93-
returnsPrimitiveVoid(issueReporter,
94-
LifecycleMethodUtils::classTemplateInvocationLifecycleMethodAnnotationName), //
95-
requireStatic
96-
? isStatic(issueReporter,
97-
LifecycleMethodUtils::classTemplateInvocationLifecycleMethodAnnotationName)
98-
: __ -> true //
99-
));
90+
.forEach(isNotPrivateError(issueReporter) //
91+
.and(returnsPrimitiveVoid(issueReporter,
92+
LifecycleMethodUtils::classTemplateInvocationLifecycleMethodAnnotationName)) //
93+
.and(requireStatic
94+
? isStatic(issueReporter,
95+
LifecycleMethodUtils::classTemplateInvocationLifecycleMethodAnnotationName)
96+
: __ -> true) //
97+
);
10098
}
10199

102100
private static Stream<Method> findAllClassTemplateInvocationLifecycleMethods(Class<?> testClass) {
@@ -134,8 +132,8 @@ private static List<Method> findMethodsAndCheckVoidReturnType(Class<?> testClass
134132

135133
return findAnnotatedMethods(testClass, annotationType, traversalMode).stream() //
136134
.peek(isNotPrivateDeprecation(issueReporter, annotationType::getSimpleName)) //
137-
.filter(allOf(returnsPrimitiveVoid(issueReporter, __ -> annotationType.getSimpleName()),
138-
additionalCondition)) //
135+
.filter(
136+
returnsPrimitiveVoid(issueReporter, __ -> annotationType.getSimpleName()).and(additionalCondition)) //
139137
.collect(toUnmodifiableList());
140138
}
141139

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/ClassSelectorResolver.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import static java.util.stream.Collectors.toCollection;
1616
import static java.util.stream.Collectors.toSet;
1717
import static org.junit.jupiter.engine.descriptor.NestedClassTestDescriptor.getEnclosingTestClasses;
18-
import static org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests.isTestOrTestFactoryOrTestTemplateMethod;
1918
import static org.junit.platform.commons.support.AnnotationSupport.isAnnotated;
2019
import static org.junit.platform.commons.support.HierarchyTraversalMode.TOP_DOWN;
2120
import static org.junit.platform.commons.support.ReflectionSupport.findMethods;
@@ -45,7 +44,6 @@
4544
import org.junit.jupiter.engine.descriptor.Filterable;
4645
import org.junit.jupiter.engine.descriptor.NestedClassTestDescriptor;
4746
import org.junit.jupiter.engine.descriptor.TestClassAware;
48-
import org.junit.jupiter.engine.discovery.predicates.IsNestedTestClass;
4947
import org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests;
5048
import org.junit.platform.commons.support.ReflectionSupport;
5149
import org.junit.platform.engine.DiscoverySelector;
@@ -56,37 +54,40 @@
5654
import org.junit.platform.engine.discovery.IterationSelector;
5755
import org.junit.platform.engine.discovery.NestedClassSelector;
5856
import org.junit.platform.engine.discovery.UniqueIdSelector;
57+
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
5958
import org.junit.platform.engine.support.discovery.SelectorResolver;
6059

6160
/**
6261
* @since 5.5
6362
*/
6463
class ClassSelectorResolver implements SelectorResolver {
6564

66-
private static final IsTestClassWithTests isTestClassWithTests = new IsTestClassWithTests();
67-
private static final IsNestedTestClass isNestedTestClass = new IsNestedTestClass();
6865
private static final Predicate<Class<?>> isAnnotatedWithClassTemplate = testClass -> isAnnotated(testClass,
6966
ClassTemplate.class);
7067

68+
private final IsTestClassWithTests isTestClassWithTests;
69+
7170
private final Predicate<String> classNameFilter;
7271
private final JupiterConfiguration configuration;
7372

74-
ClassSelectorResolver(Predicate<String> classNameFilter, JupiterConfiguration configuration) {
73+
ClassSelectorResolver(Predicate<String> classNameFilter, JupiterConfiguration configuration,
74+
DiscoveryIssueReporter issueReporter) {
7575
this.classNameFilter = classNameFilter;
7676
this.configuration = configuration;
77+
this.isTestClassWithTests = new IsTestClassWithTests(issueReporter);
7778
}
7879

7980
@Override
8081
public Resolution resolve(ClassSelector selector, Context context) {
8182
Class<?> testClass = selector.getJavaClass();
82-
if (isTestClassWithTests.test(testClass)) {
83+
if (this.isTestClassWithTests.test(testClass)) {
8384
// Nested tests are never filtered out
8485
if (classNameFilter.test(testClass.getName())) {
8586
return toResolution(
8687
context.addToParent(parent -> Optional.of(newStaticClassTestDescriptor(parent, testClass))));
8788
}
8889
}
89-
else if (isNestedTestClass.test(testClass)) {
90+
else if (this.isTestClassWithTests.isNestedTestClass.test(testClass)) {
9091
return toResolution(context.addToParent(() -> DiscoverySelectors.selectClass(testClass.getEnclosingClass()),
9192
parent -> Optional.of(newMemberClassTestDescriptor(parent, testClass))));
9293
}
@@ -95,7 +96,7 @@ else if (isNestedTestClass.test(testClass)) {
9596

9697
@Override
9798
public Resolution resolve(NestedClassSelector selector, Context context) {
98-
if (isNestedTestClass.test(selector.getNestedClass())) {
99+
if (this.isTestClassWithTests.isNestedTestClass.test(selector.getNestedClass())) {
99100
return toResolution(context.addToParent(() -> selectClass(selector.getEnclosingClasses()),
100101
parent -> Optional.of(newMemberClassTestDescriptor(parent, selector.getNestedClass()))));
101102
}
@@ -165,7 +166,7 @@ private Resolution resolveStaticClassUniqueId(Context context, UniqueId.Segment
165166

166167
String className = lastSegment.getValue();
167168
return ReflectionSupport.tryToLoadClass(className).toOptional() //
168-
.filter(isTestClassWithTests) //
169+
.filter(this.isTestClassWithTests) //
169170
.filter(condition) //
170171
.map(testClass -> toResolution(
171172
context.addToParent(parent -> Optional.of(factory.apply(parent, testClass))))) //
@@ -179,8 +180,8 @@ private Resolution resolveNestedClassUniqueId(Context context, UniqueId uniqueId
179180
String simpleClassName = uniqueId.getLastSegment().getValue();
180181
return toResolution(context.addToParent(() -> selectUniqueId(uniqueId.removeLastSegment()), parent -> {
181182
Class<?> parentTestClass = ((TestClassAware) parent).getTestClass();
182-
return ReflectionSupport.findNestedClasses(parentTestClass,
183-
isNestedTestClass.and(where(Class::getSimpleName, isEqual(simpleClassName)))).stream() //
183+
return ReflectionSupport.findNestedClasses(parentTestClass, this.isTestClassWithTests.isNestedTestClass.and(
184+
where(Class::getSimpleName, isEqual(simpleClassName)))).stream() //
184185
.findFirst() //
185186
.filter(condition) //
186187
.map(testClass -> factory.apply(parent, testClass));
@@ -271,10 +272,12 @@ private Supplier<Set<? extends DiscoverySelector>> expansionCallback(TestDescrip
271272
}
272273
List<Class<?>> testClasses = testClassesSupplier.get();
273274
Class<?> testClass = testClasses.get(testClasses.size() - 1);
274-
Stream<DiscoverySelector> methods = findMethods(testClass, isTestOrTestFactoryOrTestTemplateMethod,
275-
TOP_DOWN).stream().map(method -> selectMethod(testClasses, method));
276-
Stream<NestedClassSelector> nestedClasses = streamNestedClasses(testClass, isNestedTestClass).map(
277-
nestedClass -> DiscoverySelectors.selectNestedClass(testClasses, nestedClass));
275+
Stream<DiscoverySelector> methods = findMethods(testClass,
276+
this.isTestClassWithTests.isTestOrTestFactoryOrTestTemplateMethod, TOP_DOWN).stream().map(
277+
method -> selectMethod(testClasses, method));
278+
Stream<NestedClassSelector> nestedClasses = streamNestedClasses(testClass,
279+
this.isTestClassWithTests.isNestedTestClass).map(
280+
nestedClass -> DiscoverySelectors.selectNestedClass(testClasses, nestedClass));
278281
return Stream.concat(methods, nestedClasses).collect(
279282
toCollection((Supplier<Set<DiscoverySelector>>) LinkedHashSet::new));
280283
};

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/DiscoverySelectorResolver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@
3737
public class DiscoverySelectorResolver {
3838

3939
private static final EngineDiscoveryRequestResolver<JupiterEngineDescriptor> resolver = EngineDiscoveryRequestResolver.<JupiterEngineDescriptor> builder() //
40-
.addClassContainerSelectorResolver(new IsTestClassWithTests()) //
41-
.addSelectorResolver(ctx -> new ClassSelectorResolver(ctx.getClassNameFilter(), getConfiguration(ctx))) //
40+
.addClassContainerSelectorResolverWithContext(ctx -> new IsTestClassWithTests(ctx.getIssueReporter())) //
41+
.addSelectorResolver(ctx -> new ClassSelectorResolver(ctx.getClassNameFilter(), getConfiguration(ctx),
42+
ctx.getIssueReporter())) //
4243
.addSelectorResolver(ctx -> new MethodSelectorResolver(getConfiguration(ctx), ctx.getIssueReporter())) //
4344
.addTestDescriptorVisitor(ctx -> TestDescriptor.Visitor.composite( //
4445
new ClassOrderingVisitor(getConfiguration(ctx)), //

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodSelectorResolver.java

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor;
3737
import org.junit.jupiter.engine.descriptor.TestTemplateInvocationTestDescriptor;
3838
import org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor;
39-
import org.junit.jupiter.engine.discovery.predicates.IsNestedTestClass;
4039
import org.junit.jupiter.engine.discovery.predicates.IsTestClassWithTests;
4140
import org.junit.jupiter.engine.discovery.predicates.IsTestFactoryMethod;
4241
import org.junit.jupiter.engine.discovery.predicates.IsTestMethod;
@@ -62,15 +61,18 @@
6261
class MethodSelectorResolver implements SelectorResolver {
6362

6463
private static final MethodFinder methodFinder = new MethodFinder();
65-
private static final Predicate<Class<?>> testClassPredicate = new IsTestClassWithTests().or(
66-
new IsNestedTestClass());
64+
private final Predicate<Class<?>> testClassPredicate;
6765

6866
private final JupiterConfiguration configuration;
6967
private final DiscoveryIssueReporter issueReporter;
68+
private final List<MethodType> methodTypes;
7069

7170
MethodSelectorResolver(JupiterConfiguration configuration, DiscoveryIssueReporter issueReporter) {
7271
this.configuration = configuration;
7372
this.issueReporter = issueReporter;
73+
this.methodTypes = MethodType.allPossibilities(issueReporter);
74+
IsTestClassWithTests classPredicate = new IsTestClassWithTests(issueReporter);
75+
this.testClassPredicate = classPredicate.or(classPredicate.isNestedTestClass);
7476
}
7577

7678
@Override
@@ -92,7 +94,7 @@ private Resolution resolve(Context context, List<Class<?>> enclosingClasses, Cla
9294
}
9395
Method method = methodSupplier.get();
9496
// @formatter:off
95-
Set<Match> matches = Arrays.stream(MethodType.values())
97+
Set<Match> matches = methodTypes.stream()
9698
.map(methodType -> methodType.resolve(enclosingClasses, testClass, method, context, configuration))
9799
.filter(Optional::isPresent)
98100
.map(Optional::get)
@@ -116,7 +118,7 @@ private Resolution resolve(Context context, List<Class<?>> enclosingClasses, Cla
116118
public Resolution resolve(UniqueIdSelector selector, Context context) {
117119
UniqueId uniqueId = selector.getUniqueId();
118120
// @formatter:off
119-
return Arrays.stream(MethodType.values())
121+
return methodTypes.stream()
120122
.map(methodType -> methodType.resolveUniqueIdIntoTestDescriptor(uniqueId, context, configuration))
121123
.filter(Optional::isPresent)
122124
.map(Optional::get)
@@ -164,48 +166,34 @@ private Supplier<Set<? extends DiscoverySelector>> expansionCallback(TestDescrip
164166
};
165167
}
166168

167-
private enum MethodType {
168-
169-
TEST(new IsTestMethod(), TestMethodTestDescriptor.SEGMENT_TYPE) {
170-
@Override
171-
protected TestDescriptor createTestDescriptor(UniqueId uniqueId, Class<?> testClass, Method method,
172-
Supplier<List<Class<?>>> enclosingInstanceTypes, JupiterConfiguration configuration) {
173-
return new TestMethodTestDescriptor(uniqueId, testClass, method, enclosingInstanceTypes, configuration);
174-
}
175-
},
176-
177-
TEST_FACTORY(new IsTestFactoryMethod(), TestFactoryTestDescriptor.SEGMENT_TYPE,
178-
TestFactoryTestDescriptor.DYNAMIC_CONTAINER_SEGMENT_TYPE,
179-
TestFactoryTestDescriptor.DYNAMIC_TEST_SEGMENT_TYPE) {
180-
@Override
181-
protected TestDescriptor createTestDescriptor(UniqueId uniqueId, Class<?> testClass, Method method,
182-
Supplier<List<Class<?>>> enclosingInstanceTypes, JupiterConfiguration configuration) {
183-
return new TestFactoryTestDescriptor(uniqueId, testClass, method, enclosingInstanceTypes,
184-
configuration);
185-
}
186-
},
187-
188-
TEST_TEMPLATE(new IsTestTemplateMethod(), TestTemplateTestDescriptor.SEGMENT_TYPE,
189-
TestTemplateInvocationTestDescriptor.SEGMENT_TYPE) {
190-
@Override
191-
protected TestDescriptor createTestDescriptor(UniqueId uniqueId, Class<?> testClass, Method method,
192-
Supplier<List<Class<?>>> enclosingInstanceTypes, JupiterConfiguration configuration) {
193-
return new TestTemplateTestDescriptor(uniqueId, testClass, method, enclosingInstanceTypes,
194-
configuration);
195-
}
196-
};
169+
private static class MethodType {
170+
171+
static List<MethodType> allPossibilities(DiscoveryIssueReporter issueReporter) {
172+
return Arrays.asList( //
173+
new MethodType(new IsTestMethod(issueReporter), TestMethodTestDescriptor::new,
174+
TestMethodTestDescriptor.SEGMENT_TYPE), //
175+
new MethodType(new IsTestFactoryMethod(issueReporter), TestFactoryTestDescriptor::new,
176+
TestFactoryTestDescriptor.SEGMENT_TYPE, TestFactoryTestDescriptor.DYNAMIC_CONTAINER_SEGMENT_TYPE,
177+
TestFactoryTestDescriptor.DYNAMIC_TEST_SEGMENT_TYPE), //
178+
new MethodType(new IsTestTemplateMethod(issueReporter), TestTemplateTestDescriptor::new,
179+
TestTemplateTestDescriptor.SEGMENT_TYPE, TestTemplateInvocationTestDescriptor.SEGMENT_TYPE) //
180+
);
181+
}
197182

198183
private final Predicate<Method> methodPredicate;
184+
private final TestDescriptorFactory testDescriptorFactory;
199185
private final String segmentType;
200186
private final Set<String> dynamicDescendantSegmentTypes;
201187

202-
MethodType(Predicate<Method> methodPredicate, String segmentType, String... dynamicDescendantSegmentTypes) {
188+
private MethodType(Predicate<Method> methodPredicate, TestDescriptorFactory testDescriptorFactory,
189+
String segmentType, String... dynamicDescendantSegmentTypes) {
203190
this.methodPredicate = methodPredicate;
191+
this.testDescriptorFactory = testDescriptorFactory;
204192
this.segmentType = segmentType;
205193
this.dynamicDescendantSegmentTypes = new LinkedHashSet<>(Arrays.asList(dynamicDescendantSegmentTypes));
206194
}
207195

208-
private Optional<TestDescriptor> resolve(List<Class<?>> enclosingClasses, Class<?> testClass, Method method,
196+
Optional<TestDescriptor> resolve(List<Class<?>> enclosingClasses, Class<?> testClass, Method method,
209197
Context context, JupiterConfiguration configuration) {
210198
if (!methodPredicate.test(method)) {
211199
return Optional.empty();
@@ -221,7 +209,7 @@ private DiscoverySelector selectClass(List<Class<?>> enclosingClasses, Class<?>
221209
return DiscoverySelectors.selectNestedClass(enclosingClasses, testClass);
222210
}
223211

224-
private Optional<TestDescriptor> resolveUniqueIdIntoTestDescriptor(UniqueId uniqueId, Context context,
212+
Optional<TestDescriptor> resolveUniqueIdIntoTestDescriptor(UniqueId uniqueId, Context context,
225213
JupiterConfiguration configuration) {
226214
UniqueId.Segment lastSegment = uniqueId.getLastSegment();
227215
if (segmentType.equals(lastSegment.getType())) {
@@ -244,8 +232,8 @@ private Optional<TestDescriptor> resolveUniqueIdIntoTestDescriptor(UniqueId uniq
244232
private TestDescriptor createTestDescriptor(TestDescriptor parent, Class<?> testClass, Method method,
245233
JupiterConfiguration configuration) {
246234
UniqueId uniqueId = createUniqueId(method, parent);
247-
return createTestDescriptor(uniqueId, testClass, method, ((TestClassAware) parent)::getEnclosingTestClasses,
248-
configuration);
235+
return testDescriptorFactory.create(uniqueId, testClass, method,
236+
((TestClassAware) parent)::getEnclosingTestClasses, configuration);
249237
}
250238

251239
private UniqueId createUniqueId(Method method, TestDescriptor parent) {
@@ -254,8 +242,10 @@ private UniqueId createUniqueId(Method method, TestDescriptor parent) {
254242
return parent.getUniqueId().append(segmentType, methodId);
255243
}
256244

257-
protected abstract TestDescriptor createTestDescriptor(UniqueId uniqueId, Class<?> testClass, Method method,
258-
Supplier<List<Class<?>>> enclosingInstanceTypes, JupiterConfiguration configuration);
245+
interface TestDescriptorFactory {
246+
TestDescriptor create(UniqueId uniqueId, Class<?> testClass, Method method,
247+
Supplier<List<Class<?>>> enclosingInstanceTypes, JupiterConfiguration configuration);
248+
}
259249

260250
}
261251

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates/IsNestedTestClass.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public class IsNestedTestClass implements Predicate<Class<?>> {
2828

2929
private static final IsInnerClass isInnerClass = new IsInnerClass();
3030

31+
IsNestedTestClass() {
32+
}
33+
3134
@Override
3235
public boolean test(Class<?> candidate) {
3336
//please do not collapse into single return

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates/IsTestClassWithTests.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.apiguardian.api.API;
1919
import org.junit.platform.commons.support.ReflectionSupport;
2020
import org.junit.platform.commons.util.ReflectionUtils;
21+
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
2122

2223
/**
2324
* Test if a class is a JUnit Jupiter test class containing executable tests,
@@ -28,18 +29,18 @@
2829
@API(status = INTERNAL, since = "5.1")
2930
public class IsTestClassWithTests implements Predicate<Class<?>> {
3031

31-
private static final IsTestMethod isTestMethod = new IsTestMethod();
32-
33-
private static final IsTestFactoryMethod isTestFactoryMethod = new IsTestFactoryMethod();
34-
35-
private static final IsTestTemplateMethod isTestTemplateMethod = new IsTestTemplateMethod();
36-
37-
public static final Predicate<Method> isTestOrTestFactoryOrTestTemplateMethod = isTestMethod.or(
38-
isTestFactoryMethod).or(isTestTemplateMethod);
32+
public final Predicate<Method> isTestOrTestFactoryOrTestTemplateMethod;
3933

4034
private static final IsPotentialTestContainer isPotentialTestContainer = new IsPotentialTestContainer();
4135

42-
private static final IsNestedTestClass isNestedTestClass = new IsNestedTestClass();
36+
public final IsNestedTestClass isNestedTestClass = new IsNestedTestClass();
37+
38+
@API(status = INTERNAL, since = "5.13")
39+
public IsTestClassWithTests(DiscoveryIssueReporter issueReporter) {
40+
this.isTestOrTestFactoryOrTestTemplateMethod = new IsTestMethod(issueReporter) //
41+
.or(new IsTestFactoryMethod(issueReporter)) //
42+
.or(new IsTestTemplateMethod(issueReporter));
43+
}
4344

4445
@Override
4546
public boolean test(Class<?> candidate) {

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates/IsTestFactoryMethod.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import org.apiguardian.api.API;
1616
import org.junit.jupiter.api.TestFactory;
17+
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
1718

1819
/**
1920
* Test if a method is a JUnit Jupiter {@link TestFactory @TestFactory} method.
@@ -26,8 +27,8 @@
2627
@API(status = INTERNAL, since = "5.0")
2728
public class IsTestFactoryMethod extends IsTestableMethod {
2829

29-
public IsTestFactoryMethod() {
30-
super(TestFactory.class, false);
30+
public IsTestFactoryMethod(DiscoveryIssueReporter issueReporter) {
31+
super(TestFactory.class, false, issueReporter);
3132
}
3233

3334
}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates/IsTestMethod.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import org.apiguardian.api.API;
1616
import org.junit.jupiter.api.Test;
17+
import org.junit.platform.engine.support.discovery.DiscoveryIssueReporter;
1718

1819
/**
1920
* Test if a method is a JUnit Jupiter {@link Test @Test} method.
@@ -23,8 +24,8 @@
2324
@API(status = INTERNAL, since = "5.0")
2425
public class IsTestMethod extends IsTestableMethod {
2526

26-
public IsTestMethod() {
27-
super(Test.class, true);
27+
public IsTestMethod(DiscoveryIssueReporter issueReporter) {
28+
super(Test.class, true, issueReporter);
2829
}
2930

3031
}

0 commit comments

Comments
 (0)