前面的文章已经大概实现了普通方法的mock
了。final
方法大概要复杂一点,因为cglib
天生不支持拦截final
方法。
我们的处理方案也是非常简单:把final
方法改成非final
方法。
当然这不是要求用户改,而是通过徒手撸一个Mock框架(三)—— JUnit4Runner+ClassLoader=为所欲为定义的自定义类加载器来完成这件事情。
仿照那里的做法,我们只需要改进一下RemoveFinalFlagClassVisitor
。现在的RemoveFinalFlagClassVisitor
只处理了final
的类声明,类似地,我们可以也可以通过这个移除掉方法的final
声明。
只需要重载方法visitMethod
:
在我们的测试里面,加上RunWith
和PrepareForTest
注解,准备自定义加载器的运行环境:
我们的测试是:
运行测试,一切okay。
代码地址
徒手撸一个Mock框架(五)—— 复杂Matcher,Answer,void方法
徒手撸一个Mock框架(四)—— when...then...追上我就让你嘿嘿嘿
徒手撸一个Mock框架(三)—— JUnit4Runner+ClassLoader=为所欲为
徒手撸一个Mock框架(二)——如何创建final类的代理
徒手撸一个Mock框架(一)——如何创建一个mock对象