单元测试时未找到自定义注释

时间:2018-05-29 14:40:06

标签: java reflection junit annotations

说我有一个这样的注释:

@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);
}

运行时一切正常!找到并正确设置注释!

但是!使用JUnit对convert方法进行单元测试: this.getClass()。getAnnotation(AutoConvert.class) 始终返回null。

测试如下:

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

运行单元测试时,反射是否找不到自定义注释? 有没有人对我有答案? 我真的很感激。

提前谢谢。

修改 好吧,它似乎是基于这种吸引... 我做了以下事情:

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

可能一个实例丢失了所有注释 如果我在实例化上覆盖一些方法?

1 个答案:

答案 0 :(得分:3)

由于exampleCommandToExample ref表示匿名类的实例,因此调用this.getClass().getAnnotation(AutoConvert.class)会收集其级别的注释和所有继承的注释。

但是,此匿名实现示例中的@AutoConvert未被继承,这就是为什么getAnnotation返回null,这与Java API中声明的行为完全对应:< / p>

  

如果存在这样的注释,则返回指定类型的此元素的注释,否则为null。

要解决此问题,只需添加

即可
import java.lang.annotation.Inherited;

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

@Inherited将使匿名实现的注释可见。