Пользовательская аннотация не найдена во время модульного тестирования - PullRequest
0 голосов
/ 29 мая 2018

скажем, у меня есть аннотация, подобная этой:

@Retention(RetentionPolicy.RUNTIME)
public @interface AutoConvert {
    boolean enabled() default true;
}

и класс, помеченный им:

@AutoConvert
public class ExampleCommandToExample extends BaseConverter{}

На суперклассе я делаю следующее:

public void convert(){
  Annotation annotation = (AutoConvert) this.getClass().getAnnotation(AutoConvert.class);
}

Все отлично работает во время выполнения!Аннотация найдена и правильно установлена!

Но!При модульном тестировании метода convert с помощью JUnit: this.getClass (). GetAnnotation (AutoConvert.class) всегда возвращает ноль.

Тест выглядит следующим образом:

@Test
public void convertTest(){
    //when
    exampleCommandToExample.convert();
}

Не отображаются ли пользовательские аннотации отражением при выполнении модульных тестов?У кого-нибудь есть ответ для меня?Я был бы очень признателен за это.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Хорошо, похоже, что это основано на такой инициации ... Я делаю следующее:

exampleCommandToExample = new ExampleCommandToExample() {
    @Override
    public Type overideSomeMethod() {
        return type;
    }
};

Может ли экземпляр потерять все свои аннотации, если я переопределю некоторые методы при создании экземпляра?

1 Ответ

0 голосов
/ 30 мая 2018

Поскольку exampleCommandToExample ref представляет экземпляр анонимного класса, вызов this.getClass().getAnnotation(AutoConvert.class) собирает аннотации на своем уровне и все унаследованные.

Однако @AutoConvert в этом примере анонимной реализации имеет видне наследуется, поэтому getAnnotation возвращает null, что в точности соответствует поведению, объявленному в Java API :

Возвращает аннотацию этого элемента для указанного типа, если такаяаннотация присутствует, иначе ноль.

Чтобы решить проблему, просто добавьте

import java.lang.annotation.Inherited;

@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AutoConvert { /* no changes */ }

@Inherited, чтобы аннотация стала видимой для анонимной реализации.

...