2016-08-02 4 views
2

Используя библиотеку 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 для отражений, чтобы он работал для последнего случая?

+0

корень теста и корень источников равны? – dit

+0

@dit, нет, я исправил свой вопрос – dzieciou

ответ

2

Я нашел решение. При создании 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())); 
Смежные вопросы