Mockito擦除应用于我的类的注释



我有一个注释,

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

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

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

也许这里面有什么把戏。有什么想法吗?谢谢大家。

我已经尝试在流程实例上模拟getClass((,但它是最终的,所以不能模拟。

在阅读以下文档之前,我一直被这个问题难住了:

38.元数据和通用类型保留(自2.1.0起(

Mockito现在还保留了对mocked方法和类型的注释作为通用元数据。以前,mock类型不保留类型上的注释,除非它们是显式继承的并且从不继承保留了对方法的注释。因此条件现在成立:

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

最新更新