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截屏代码实现方法
  3. 《第一行代码》学习笔记一
  4. [置顶] Android Scroll详解(三):Android 绘制过程详解
  5. Ubuntu下 eclipse搭建android集成开发环境
  6. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框

随机推荐

  1. 5. android 列表视图
  2. Android自定义view七时间轴(二)---横向的图
  3. 关于android录音权限被用户禁用的问题解
  4. android 拍照,图片裁剪,选择图片
  5. animation1
  6. 获取Android各类系统相关信息的接口实现
  7. 隐藏 video标签的下载按钮
  8. android(9)(使用pull解析xml文件)
  9. android DTMFTwelveKeyDialer使用中的一
  10. [置顶] android,在java代码中,如何给textvi