前面几篇文章,已经解释清楚了如何mock
各种类型的方法。然而,这里面存在一个问题,就是这个mock
对象,所有的方法都被mock
了,不会再执行原来的逻辑。万一我想执行原始的方法呢?
这篇文章就是要解决这么一个问题。即,该如何实现mockito
里面的thenCallRealMethod
这种机制。
先来看看mockito
里面的thenCallRealMethod
大概的用法:
when(mockObj.doSomething(anyString())).thenCallRealMethod();
我们的实现,只需要考虑两种方法:实例方法和静态方法。因为final
方法被我们去掉了final
标志之后,实际上就是一个普通的方法。
实例方法
实例方法的mock
在徒手撸一个Mock框架(四)里面提及。其关键就是实现一个realCall
的answer
:
我简单解释一下,这里面的关键是proxy.invokeSuper()
。这里的proxy
是cglib
的MethodProxy
实例。它源自:
至于invokeSuper
就简单了,我们的cglib
代理对象是通过继承机制来生成的,所以要想调用原始的方法,只能使用invokeSuper
。
使用也很简单:
静态方法
静态方法其实也很简单。因为之前我们在mock
静态方法的时候,其实已经将原始的方法保存下来了,只是重命名了一下:
箭头指示的就是我们重命名之后的方法名字。参数类型及其顺序并没有修改。所以要调用原始的实现很简单,我们在检测到它需要调用原始方法的时候,就直接调用这个方法:
测试:
运行起来,毫无破绽。
徒手撸一个Mock框架(七)—— mock static方法
徒手撸一个Mock框架(六)—— mock final方法:
徒手撸一个Mock框架(五)—— 复杂Matcher,Answer,void方法
徒手撸一个Mock框架(四)—— when XXX then 嘿嘿嘿