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

前面的文章已经大概实现了普通方法的mock了。final方法大概要复杂一点,因为cglib天生不支持拦截final方法。

我们的处理方案也是非常简单:把final方法改成非final方法。

当然这不是要求用户改,而是通过徒手撸一个Mock框架(三)—— JUnit4Runner+ClassLoader=为所欲为定义的自定义类加载器来完成这件事情。

仿照那里的做法,我们只需要改进一下RemoveFinalFlagClassVisitor。现在的RemoveFinalFlagClassVisitor只处理了final的类声明,类似地,我们可以也可以通过这个移除掉方法的final声明。

只需要重载方法visitMethod:

在我们的测试里面,加上RunWithPrepareForTest注解,准备自定义加载器的运行环境:

我们的测试是:

运行测试,一切okay。

代码地址
徒手撸一个Mock框架(五)—— 复杂Matcher,Answer,void方法
徒手撸一个Mock框架(四)—— when...then...追上我就让你嘿嘿嘿
徒手撸一个Mock框架(三)—— JUnit4Runner+ClassLoader=为所欲为
徒手撸一个Mock框架(二)——如何创建final类的代理
徒手撸一个Mock框架(一)——如何创建一个mock对象

你可能感兴趣的:(徒手撸一个Mock框架(六)—— mock final方法)