Search code examples
junit5

Can I exclude subpackages when discovering JUnit5 tests?


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.


Solution

  • 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)
    • a period (quoted with backslashes)
    • one or more non-periods followed by a period (representing a subpackage name)
    • 0 or more characters (further subpackages or the class in a subpackage)