背景
前面两篇提到,Mockito 默认基于创建派生类(subclass)来实现 mock(包括 spy)。
那么问题来了,如果我的类标记为 final,明确禁止创建派生类,那不就没法 mock 了吗?
为了解决这个问题,Mockito 2 中引入了 InlineByteBuddyMockMaker
。和前面讨论过的默认的 SubclassByteBuddyMockMaker
相比,这个 InlineByteBuddyMockMaker
同样基于 Byte Buddy 这个提供 Java 字节码操作功能的第三方库,但会尽量不通过创建派生类来实现 mock。
(注:本文基于 Mockito 4.6.1 源码)
方法
正常方法
对 final 类进行 mock,需要用 InlineByteBuddyMockMaker
替换掉默认的 SubclassByteBuddyMockMaker
。
替换方法是通过创建一个配置文件。按照这篇教程,应该是在 src/test/resources/mockito-extensions
这个目录下,创建一个名为 org.mockito.plugins.MockMaker
的文件(这个名字其实就是 MockMaker 接口,我们其实就是在为这个接口指定一个实现,否则就会用默认的 SubclassByteBuddyMockMaker
实现了),然后在这个文件里写入:
mock-maker-inline
或者(下面这个是我在源码注释中看到的,其实就是我们要使用的实现类):文章来源:https://www.toymoban.com/news/detail-490800.html
org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker
阅读源码时可以使用的方法
不幸的是,我用这个方法暂时还没有成功。但因为我是在研究 Mockito 的源码,所以我直接修改了源码中的这个文件:文章来源地址https://www.toymoban.com/news/detail-490800.html
// org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java
// 第 29 行开始
DEFAULT_PLUGINS.put(
到了这里,关于Mockito 实现原理(3):如何对 final 类进行 mock的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!