Robolectric框架概述

Robolectric框架的核心作用在于使用一套在Android api的基础上修改的或者自定义的一套api,基本上是和Android api一一对应的。需要这样做的原因是,android单元测试是跑在jvm上的。

优点是不用跑一次单元测试就完整的启动一个Android进程,jvm进程比Android启动快很多,调试或者运行的效率就高了。

但是缺点是运行时缺少android的环境,那么需要一个模拟的,简化的Android环境,可以满足测试用例对Android环境的基本依赖,下面说说Robolectric是怎么模拟以及如何简化的:

1.模拟启动Activity时调用生命周期回调方法,加入用于判断最近用于启动Activity的Intent的API(模拟的启动过程必然没有注册到AMS过程,也没有与WMS通信创建窗口的过程)

2.对模拟ContentProvider和数据库的读写(模拟中肯定没有跨进程通信,即没有向AMS发布IContentProvider的过程,对ContentProvder的读写也不依赖Binder驱动,都是在测试进程中完成),

3.对Handler,Looper,MessageQueue进行了很好的模拟,还加入了对MessageQueue中的消息分发的控制,便于对执行结果进行断言,当然模拟的消息循环系统肯定没有native消息循环部分。

总而言之,Robolectric是用于模拟了部分Android环境的,解决了测试用例需要对Android基本环境的依赖问题;不是完全的模拟,这样可以加快单元测试运行的速度;加入某些监视某些结果或者状态的接口,加入了某些用于控制生命周期或者触发特定行为的api,这样便于对被测试代码流进行控制及获取代码运行结果进行断言。

Robolectric最庞大的部分是各种Shadow类,是用于替代原Android api类中的某些方法的。而替换过程主要是org.robolectric.internal.bytecode.SandboxClassLoader控制,所以替换的过程是运行时进行的。原理是修改字节码,过程很复杂。除了Shadow类,其他替换原Android api的代码在C:\Users\<用户名>\.m2\repository\org\robolectric\android-all\<robolectric版本全称>\<robolectric版本全称>.jar中。

 

关于如何使用代码动态替换字节码的文章:https://www.jianshu.com/p/d760e48ea7b0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章