diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java index cbc3ebe5fce9..530f877caae9 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestRunnerUtil.java @@ -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 ? "" : 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 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 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);