徒手撸一个Mock框架(八)—— 调用原始方法

前面几篇文章,已经解释清楚了如何mock各种类型的方法。然而,这里面存在一个问题,就是这个mock对象,所有的方法都被mock了,不会再执行原来的逻辑。万一我想执行原始的方法呢?

这篇文章就是要解决这么一个问题。即,该如何实现mockito里面的thenCallRealMethod这种机制。

先来看看mockito里面的thenCallRealMethod大概的用法:

 when(mockObj.doSomething(anyString())).thenCallRealMethod();

我们的实现,只需要考虑两种方法:实例方法和静态方法。因为final方法被我们去掉了final标志之后,实际上就是一个普通的方法。

实例方法

实例方法的mock徒手撸一个Mock框架(四)里面提及。其关键就是实现一个realCallanswer

我简单解释一下,这里面的关键是proxy.invokeSuper()。这里的proxycglibMethodProxy实例。它源自:

至于invokeSuper就简单了,我们的cglib代理对象是通过继承机制来生成的,所以要想调用原始的方法,只能使用invokeSuper

使用也很简单:

静态方法

静态方法其实也很简单。因为之前我们在mock静态方法的时候,其实已经将原始的方法保存下来了,只是重命名了一下:

箭头指示的就是我们重命名之后的方法名字。参数类型及其顺序并没有修改。所以要调用原始的实现很简单,我们在检测到它需要调用原始方法的时候,就直接调用这个方法:

测试:

运行起来,毫无破绽。

代码地址

徒手撸一个Mock框架(七)—— mock static方法

徒手撸一个Mock框架(六)—— mock final方法:

徒手撸一个Mock框架(五)—— 复杂Matcher,Answer,void方法

徒手撸一个Mock框架(四)—— when XXX then 嘿嘿嘿

徒手撸一个Mock框架(三)—— JUnit4Runner+ClassLoader=为所欲为

徒手撸一个Mock框架(二)——如何创建final类的代理

徒手撸一个Mock框架(一)——如何创建一个mock对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。