前面的文章已经大概实现了普通方法的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对象














网友评论