Mockito 2.1.0 Mock Fianl类的原理

Mockito 从2.1.0后开始支持对final类型的mock,默认是未开启的,如果需要开启支持,需要在test的resource目录下新建mockito-extensions文件夹,并且在里面放一个名为org.mockito.plugins.MockMaker的文件,文件内容是mock-maker-inline。那么Mockitor是怎么实现对final类型的mock的呢?我们来看下官方提示的

https://static.javadoc.io/org.mockito/mockito-core/2.11.0/org/mockito/Mockito.html#39

之前的话,直接mock final类型会提示:

org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class com.mockito.xxxClass
Mockito cannot mock/spy because :
 - final class

因为mockito做了校验。

mockito.mock静态方法,调用了MockitoCore类的mock方法,

MockSettingsImpl

MockUtil

SubclassByteBuddyMockMaker


然后如果启用了final支持后,通过这个类InlineByteBuddyMockMaker来实现isTypeMockable方法。只有

转而把final类型的部分去掉了,同时不支持原始类型的包装类


如果通过了校验,同样采用objenesis来创建类的实例

Instantiator采用的是ObjenesisInstantiator来实现的,如果是构造器,则用ConstructorInstantiator。

至于启用的文件及文件内容是由PluginRegistry定义加载的

定义的INLINE_ALIAS

loadPlugin读取路径的文件


正常类路径不存在插件时返回ByteBuddyMockMaker,否则返回自定义的。


总结一下就是,通过加载值得自定义的MockMaker来跳过校验,然后利用Objenesis来生成动态代理对象

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值