Mockito删除应用于我班级的注释

问题描述 投票:0回答:1

我有一个注释,

@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个回答
0
投票

我被这个问题困扰,直到我读到this documentation

38。元数据和通用类型保留(自2.1.0开始)

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

看起来解决方案只是将其更新为Mockito> 2.1.0。我正在使用1.10.19。如果您使用的是Java 7,则可能必须升级到Java 8。

© www.soinside.com 2019 - 2024. All rights reserved.