I would like to have a Launcher
run tests that are in a package (e.g., com.somewhere
) but not in any subpackages (e.g., com.somewhere.bad
).
This code runs tests in both the package and subpackage:
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
Launcher launcher = LauncherFactory.create();
launcher.execute(request().selectors(selectPackage("com.somewhere").build());
I tried excluding subpackages with a filter and a wildcard:
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
import static org.junit.platform.engine.discovery.PackageNameFilter.excludePackageNames;
launcher.execute(request()
.selectors(selectPackage("com.somewhere"))
.filters(excludePackageNames("com.somewhere.*")) // wildcard
.build());
The filter had no effect, leading me to think that wildcards aren't permitted.
The subpackage is excluded only if I filter on its literal name:
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
import static org.junit.platform.engine.discovery.PackageNameFilter.excludePackageNames;
launcher.execute(request()
.selectors(selectPackage("com.somewhere"))
.filters(excludePackageNames("com.somewhere.bad"))
.build());
Is there a way to exclude all subpackages of a package when creating a request? If not, I am planning to filter them out in a TestExecutionListener
unless someone can suggest a better approach.
As suggested in a comment by johanneslink, the solution was to create a ClassNameFilter
:
launcher.execute(request()
.selectors(selectPackage("com.somewhere"))
.filters(ClassNameFilter.excludeClassNamePatterns(
"com.somewhere\\.[^.]+\\..*"))
.build());
The regular expression excludes class names consisting of:
com.somewhere
(the name of the package)