【问题标题】:Mockito erases annotations applied to my classMockito 删除了应用于我的班级的注释
【发布时间】:2020-06-25 20:31:12
【问题描述】:

我有一个注释,

@Retention(RetentionPolicy.RUNTIME) 
@Target(value={ElementType.METHOD, ElementType.TYPE})
public @interface JobLoggable {
    JobType jobType();
    JobDomain domain();
    JobStatus jobInitialStatus();
}

我适用于我的班级

@JobLoggable
public class Process {
    public void doSomething() {
        Annotation[] annotations = this.getClass().getAnnotations();
        Assert.assert(annotations.length == 1);
    }
}

在我的测试中,我监视它(不是模拟它,尽管这无关紧要):

public class Test {
    @Test
    public void test() {
        Process process = Mockito.spy(Process.class);
        //spy on some internal methods, capture their return values
        process.doSomething();
    }
}

遗憾的是 this.getClass().getAnnotations() 没有返回任何注释。当我查看实例是什么类时,它是: Process$$EnhancerByMockitoWithCGLIB$$3db5579b

它不是真正的 Process 类。我想这就是它无法检索注释的原因。

也许这有一些技巧。有任何想法吗?谢谢大家。

我已经尝试在流程实例上模拟 getClass() 但它是最终的,因此无法模拟。

【问题讨论】:

    标签: annotations mockito java-annotations


    【解决方案1】:

    我被这个问题难住了,直到我读到this documentation

    38.元数据和泛型类型保留(自 2.1.0 起)

    Mockito 现在也保留了模拟方法和类型的注释 作为通用元数据。以前,模拟类型不保留 类型上的注释,除非它们被显式继承并且永远不会 保留方法上的注释。因此,以下 现在条件成立:

    看起来解决方案只是简单地更新到 mockito 的 >2.1.0。我使用的是 1.10.19。如果您使用的是 Java 7,则可能需要升级到 Java 8。

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 2016-05-08
      • 2018-06-09
      • 1970-01-01
      • 2012-11-02
      • 2010-10-24
      • 1970-01-01
      • 2011-02-28
      • 2018-05-03
      相关资源
      最近更新 更多