通过 LauncherDiscoveryRequest 在提供的类路径上发现测试

Ben*_*hko 4 java junit5

我正在尝试在用户指南中所述LauncherDiscoveryRequest的帮助下发现 JUnit 5 测试。我正在使用的代码如下所示:

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
    .filters(includeClassNamePatterns(".*"))
    .build();

TestPlan plan = LauncherFactory.create().discover(request);

for (TestIdentifier root : plan.getRoots()) {
    System.out.println("Root: " + root.toString());

    for (TestIdentifier test : plan.getChildren(root)) {
        System.out.println("Found test: " + test.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

是否LauncherDiscoveryRequestBuilder仅自动发现运行此代码的 JVM 的类路径上的测试?我尝试使用方法DiscoverySelectors.selectClasspathRootsDiscoverySelectors.selectClasspathResource作为选择器来提供要搜索测试类的根目录。但是,我无法发现任何测试。selectClasspathRoots和 的参数是否selectClasspathResource必须指向包含按包组织的类文件的根目录,或者是否提供每个测试类文件的完整路径?

我尝试了以下内容,其中/some/dir代表包含测试类文件的根目录:

File classesDir = new File("/some/dir");
LauncherDiscoveryRequestBuilder.request()
     .selectors(selectClasspathRoots(Collections.singleton(Paths.get(classesDir.toURI()))))
     .build();
Run Code Online (Sandbox Code Playgroud)

我看了一下,LauncherDiscoveryRequestBuilderTests.java但它对于弄清楚为什么我的示例代码不起作用非常有用。我如何最好地诊断问题?

我正在使用以下依赖项:

  • org.junit.platform:junit-platform-engine:1.0.0-M3
  • org.junit.platform:junit-platform-launcher:1.0.0-M3

Mar*_*ipp 5

是否LauncherDiscoveryRequestBuilder仅自动发现运行此代码的 JVM 的类路径上的测试?

简短的回答:是的,Launcher只会自动发现运行代码的 JVM 的类路径上的测试。

一般来说,TestEngine实现负责解析选择器,例如ClasspathRootSelector您通过 . 创建的选择器selectClasspathRoots()。Jupiter 和 Vintage 引擎将扫描提供的目录中的文件.class,然后尝试使用当前线程的 context 加载它们ClassLoader。如果后一步失败,该类将被默默忽略。

如果您想发现尚未在类路径上的测试,则需要创建一个新的ClassLoader并将其设为当前线程的上下文ClassLoader。JUnit 平台ConsoleLauncher也这样做:

  1. 创建自定义ClassLoader
  2. Launcher使用替换的上下文调用ClassLoader