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\
关于如何使用代码动态替换字节码的文章:https://www.jianshu.com/p/d760e48ea7b0
更多相关文章
- Android第一行代码学习笔记三----广播
- android截屏代码实现方法
- 《第一行代码》学习笔记一
- [置顶] Android Scroll详解(三):Android 绘制过程详解
- Ubuntu下 eclipse搭建android集成开发环境
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框