[junit 5] avoid MethodSelector when the corresponding javaMethod doesn't exist (IDEA-284245)

GitOrigin-RevId: f3624b5d74489fd41ead9ee6b3a7c1f3fc8e9360
This commit is contained in:
Anna Kozlova
2021-12-09 15:18:07 +00:00
committed by intellij-monorepo-bot
parent 0daaee3a96
commit baf9b751bf
@@ -3,8 +3,13 @@ package com.intellij.junit5;
import org.junit.platform.commons.util.AnnotationUtils;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.FilterResult;
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.TestSource;
import org.junit.platform.engine.discovery.*;
import org.junit.platform.engine.support.descriptor.MethodSource;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.PostDiscoveryFilter;
import org.junit.platform.launcher.TagFilter;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
@@ -71,14 +76,23 @@ public class JUnit5TestRunnerUtil {
selectors.add(selector);
}
}
if (hasBrokenSelector(selectors)) {
builder.filters(createMethodFilter(new ArrayList<>(selectors)));
for (int i = 0; i < selectors.size(); i++) {
DiscoverySelector selector = selectors.get(i);
if (selector instanceof MethodSelector) {
selectors.set(i, DiscoverySelectors.selectClass(((MethodSelector)selector).getClassName()));
}
}
}
packageNameRef[0] = packageName.length() == 0 ? "<default package>" : packageName;
if (selectors.isEmpty()) {
builder = builder.selectors(DiscoverySelectors.selectPackage(packageName));
builder.selectors(DiscoverySelectors.selectPackage(packageName));
}
else {
builder = builder.selectors(selectors);
builder.selectors(selectors);
if (!packageName.isEmpty()) {
builder = builder.filters(PackageNameFilter.includePackageNames(packageName));
builder.filters(PackageNameFilter.includePackageNames(packageName));
}
}
if (filters != null && !filters.isEmpty()) {
@@ -93,11 +107,10 @@ public class JUnit5TestRunnerUtil {
}
}
}
builder = builder.filters(ClassNameFilter.includeClassNamePatterns(classNames));
builder.filters(ClassNameFilter.includeClassNamePatterns(classNames));
}
if (tags != null && !tags.isEmpty()) {
builder = builder
.filters(TagFilter.includeTags(tags.split(" ")));
builder.filters(TagFilter.includeTags(tags.split(" ")));
}
return builder.filters(ClassNameFilter.excludeClassNamePatterns("com\\.intellij\\.rt.*", "com\\.intellij\\.junit3.*")).build();
}
@@ -117,6 +130,15 @@ public class JUnit5TestRunnerUtil {
}
DiscoverySelector selector = createSelector(suiteClassNames[0], packageNameRef);
if (selector instanceof MethodSelector) {
try {
((MethodSelector)selector).getJavaMethod();
}
catch (Throwable e) {
builder.filters(createMethodFilter(Collections.singletonList(selector)));
selector = DiscoverySelectors.selectClass(((MethodSelector)selector).getClassName());
}
}
assert selector != null : "selector by class name is never null";
return builder.selectors(selector).build();
}
@@ -124,6 +146,54 @@ public class JUnit5TestRunnerUtil {
return null;
}
private static boolean hasBrokenSelector(List<DiscoverySelector> selectors) {
for (DiscoverySelector selector : selectors) {
if (selector instanceof MethodSelector) {
try {
((MethodSelector)selector).getJavaMethod();
}
catch (Throwable e) {
return true;
}
}
}
return false;
}
private static PostDiscoveryFilter createMethodFilter(List<DiscoverySelector> selectors) {
return new PostDiscoveryFilter() {
@Override
public FilterResult apply(TestDescriptor descriptor) {
return FilterResult.includedIf(shouldRun(descriptor),
() -> descriptor.getDisplayName() + " matches",
() -> descriptor.getDisplayName() + " doesn't match");
}
private boolean shouldRun(TestDescriptor descriptor) {
TestSource source = descriptor.getSource().orElse(null);
if (source instanceof MethodSource) {
for (DiscoverySelector selector : selectors) {
if (selector instanceof MethodSelector &&
((MethodSelector)selector).getClassName().equals(((MethodSource)source).getClassName()) &&
((MethodSelector)selector).getMethodName().equals(((MethodSource)source).getMethodName())) {
return true;
}
}
for (DiscoverySelector selector : selectors) {
if (selector instanceof ClassSelector &&
((ClassSelector)selector).getClassName().equals(((MethodSource)source).getClassName())) {
return true;
}
}
return false;
}
return true;
}
};
}
public static String getDisabledConditionValue(String name) {
int commaIdx = name.indexOf(",");
String className = name.substring(0, commaIdx < 0 ? name.length() : commaIdx);