annotations - 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();
}
}
遗憾的是 this.getClass().getAnnotations() 没有返回任何注释。当我查看实例是什么类时,它是: Process$$EnhancerByMockitoWithCGLIB$$$3db5579b
它不是真正的 Process 类。我想这就是它无法检索注释的原因。
也许这有一些技巧。有任何想法吗?多谢你们。
我已经尝试在流程实例上模拟 getClass() 但它是最终的,所以它不能被模拟。
解决方案
在我阅读此文档之前,我被这个问题难住了:
38. 元数据和泛型类型保留(自 2.1.0 起)
Mockito 现在保留了对模拟方法和类型以及通用元数据的注释。以前,模拟类型不会保留类型上的注释,除非它们被显式继承并且从不保留方法上的注释。因此,以下条件现在成立:
看起来解决方案只是简单地更新到 mockito 的 >2.1.0。我使用的是 1.10.19。如果您使用的是 Java 7,则可能必须升级到 Java 8。
推荐阅读
- php - 用简单的 HTML Dom 解析 SVG
- grpc - 最大 gRPC 连接数基准
- c# - 如何获取路由属性 dotnet core 3?
- numpy - Pytorch:将 [1,x] 大小的张量转换为 [x] 大小的张量
- xamarin - ActivityProvider 不运行
- xamarin.forms - 如何从代码中将 Layout 绑定到 ViewModel?
- java - Sceneform:将 WebRTC 媒体流渲染到 ExternalTexture
- nginx - 无法使用 Nginx 访问在 80 以外的端口上运行的 server_block
- swift - 通配符模式匹配:
- typescript - 如何使用量角器验证网页中显示的图形?