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
    评论
在使用Mockito框架中,可以使用反射的方式来mock一个的私有成员。具体的步骤如下: 1. 首先,使用`@InjectMocks`注解将被测的实例注入到测试中。 2. 使用`@Test`注解标记测试方法。 3. 在测试方法中,使用`Class.getDeclaredField()`方法获取私有成员的Field对象。此方法需要传入私有成员的名称。 4. 使用`Field.setAccessible(true)`方法设置该Field对象的访问权限为可访问。 5. 使用`Field.set()`方法设置私有成员的值。该方法需要传入被测的实例、私有成员的Field对象和要设置的值。 通过以上步骤,就可以成功mock一个的私有成员。这样,在测试中就可以对私有成员进行相应的验证和断言了。 需要注意的是,通过mock私有成员可能会导致测试代码与被测方法的耦合度较高,因此在设计测试用例时需要注意权衡。此外,还可以使用其他的测试框架或技术来mock私有成员,比如PowerMock等。 希望这个回答对您有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mockito mock私有变量的值](https://blog.csdn.net/Mint6/article/details/118229891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [如何mock当前的私有方法](https://blog.csdn.net/mofsfely2/article/details/128644239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值