Тестирование процессора аннотаций с тестированием компилятора - PullRequest
0 голосов
/ 22 апреля 2020

Я написал абстрактный класс util, который используется некоторым процессором аннотаций, и я пытаюсь его протестировать.

Это метод, который я пытаюсь протестировать

public static List<String> getClassNamesFromAnnotation(Element element, Class<?> annotationClass, String attributeName) {
    return element.getAnnotationMirrors().stream()
            .filter(annotationType -> annotationType.getAnnotationType().toString().equals(annotationClass.getName()))
            .findFirst()
            .map(foundAnnotation ->
                    foundAnnotation.getElementValues().entrySet().stream()
                            .filter(entry -> entry.getKey().toString().equals(String.format("%s()", attributeName)))
                            .findFirst()
                            .map(entry ->
                                    ((List<Object>) entry.getValue().getValue()).stream()
                                            .map(Object::toString)
                                            .collect(Collectors.toList()))
                            .orElse(emptyList()))
            .orElse(emptyList());
}

Цель этого метода не важна. Мне нужен способ создания временного класса в тестовом классе, который можно получить как javax.lang.model.Element и использовать в качестве тестового «элемента / класса» для этого метода.

Я пытался протестировать его с помощью этого кода

JavaFileObject fileObject = JavaFileObjects.forSourceString("TestObject","importannotations.SomeAnnotation; @SomeAnnotation public class TestObject {}");

    Compilation compilation = javac().compile(fileObject);
    assertThat(compilation).succeededWithoutWarnings();

    Element element = this.compilationRule.getElements().getTypeElement("TestObject");
    assertNotNull(element);

Но элемент возвращает ноль.

Причина, по которой я это делаю, заключается в том, что у аннотации есть поле, которое воздействует на метод по-разному, учитывая разные значения, и я не хочу создавать фактический класс в пакете тестирования для каждого сценария.

...