4

使用Reflections库,我编写了一个简单的实用程序类,它索引所有测试方法及其注释。反射库可以帮助我:

Reflections reflections = new Reflections(new ConfigurationBuilder()
  .setUrls(ClasspathHelper.forPackage(packageToIndex))
  .filterInputsBy(new FilterBuilder().includePackage(packageToIndex))
  .setScanners(
    new SubTypesScanner(false),
    new TypeAnnotationsScanner(),
    new MethodAnnotationsScanner()));

Set testMethods = reflections.getMethodsAnnotatedWith(Test.class);

如果我的实用程序类位于源根 ( src/main/java) 中,它会按预期找到所有测试方法。

但是,如果它位于测试根 ( src/test/java) 中,则它找不到任何测试方法。

我应该如何为反射定义 ConfigurationBuilder 以便它适用于后一种情况?

4

1 回答 1

4

我找到了解决方案。创建ConfigurationBuilder时定义:

  • 注册额外的类加载器,它将知道测试类的位置
  • 注册测试类位置

这是一个示例实现:

URL testClassesURL = Paths.get("target/test-classes").toUri().toURL();

URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{testClassesURL}, 
   ClasspathHelper.staticClassLoader());

Reflections reflections = new Reflections(new ConfigurationBuilder()
        .addUrls(ClasspathHelper.forPackage(packageToIndex, classLoader))
        .addClassLoader(classLoader)
        .filterInputsBy(new FilterBuilder().includePackage(packageToIndex))
        .setScanners(
                new SubTypesScanner(false),
                new TypeAnnotationsScanner(),
                new MethodAnnotationsScanner()));
于 2016-08-02T14:30:50.930 回答