配置扫描测试类的思考

时间:2016-08-02 09:14:42

标签: java google-reflections

使用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)中,则它找不到测试方法。

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

1 个答案:

答案 0 :(得分:3)

我找到了解决方案。创建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()));
相关问题