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\\.jar中。

 

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

更多相关文章

  1. Android开发应用记录
  2. Android的ADB工具使用
  3. adb shell 命令详解
  4. Android初体验
  5. 用Android模拟器体验angry birds
  6. Android(安卓)adb shell 命
  7. Android启动过程
  8. Android(安卓)Scroll详解(三):Android(安卓)绘制过程详解
  9. [置顶] Android(安卓)Scroll详解(三):Android(安卓)绘制过程详解

随机推荐

  1. CV学习笔记(十七):Windows环境复现ChineseOC
  2. CV学习笔记(十六):直线检测
  3. 初识 PHP 运行原理及数据类型
  4. php学习笔记(类声明,类的实例化,类的静态成
  5. jQuery 浅析
  6. PHP的接口和抽象类
  7. PHP接口和抽象类|接口与抽象类的区别与联
  8. 安装Win7系统之后键盘鼠标不能用/失灵没
  9. 数组的排序
  10. PHP高级编程函数的返回值和闭包与作用域