单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题的,而如果单纯为了测性去修改代码,这会大大破坏代码的整体设计,所以开发不愿意搞单元测试,而测试人员更拿这不可测的代码束手无策。
好在,在Java领域,有了PowerMock!
PowerMock简介
PowerMock使用自定义的类加载器和字节码操作技术,从而使得我们能够Mock: Static方法,构造函数, Final的类和方法,Private的方法,即使是静态初始化也不在话下。PowerMock的强大是不言而喻的,它不需要我们对IDE有任何的修改就可以直接使用,而且对持续集成的配置也没有任何额外影响。PowerMock是对现有Mock框架的拓展,目前它仅支持EasyMock和Mockito。
PowerMock能用于Android单元测试吗?
有经验的童鞋可能已经想到了,PowerMock之所以能够这么强大是因为它使用自定义的类加载器,并且在运行时操作字节码,所以他是根植于虚拟机环境的,而Java的虚拟机跟Android的虚拟机是不一样的,那么PowerMock能在Android的Dalvik虚拟机上执行嘛?
答案是否定的,PowerMock当前并没有提供适用于Dalvik虚拟机的类加载器,所以PowerMock在Android环境中是跑不起来的(有牛叉的童鞋可以考虑帮PowerMock实现下,记得分享~)
但是,考虑到单元测试的特点,我们并不是一定要被测程序在设备上运行起来,我们需要的是对所有功能单元进行逻辑覆盖,那么基于这一点,如果Java虚拟机与Dalvik差别不大的话,我们是不是可以在Java虚拟机上进行Android项目的单元测试呢?正是基于这点出发,Google非Android项目的童鞋想到了下面的Work Around方式。
创建Android Junit单元测试工程
假设我们有一个标准的Android项目,我们该如何创建我们的测试工程呢?
1. 不同于传统的Android测试项目创建,第一步我们得创建个标准的Java工程:
2. 选择我们刚创建的Java项目,右键选择属性,然后在Java Build Path项选择Projects标签,点击Add键,把被测Android项目加进来。
3. 下载PowerMock的工具包,这里我选择是最新的PowerMock+Mockito集合,然后全部解压到本地。
4. 然后我们要把PowerMock的工具包加到我们的项目里。同样是右键项目,选择属性到Java Build Path, 然后选择Libraries标签,使用Add External JARs功能把刚解压的所有Jar包加到项目 里。
5. 接上一步我们要把Android.jar包也加到我们的项目里,不然我们的Android项目就会编译失败。这里要注意,在我们配置Android开发环境时,我们会通过Android SDK Manager下载相应的Android版本到本地,通常这个Jar包在sdk\platforms\android-{SDK version}下,我们可以选择这个Jar包来配置我们的项目,但是有个潜在的问题就是以后当我们测试的代码用到Android包里的API时,就会直接抛一个RuntimeException:Stub!异常,这是因为原生的Android Jar包里的API是没有具体实现的,只是各种类和方法的签名,而内容就是直接抛这个RuntimeException异常,并且即使我们想Mock住这些方法也是不行的,所以最好不要用这个Jar包。那解决办法就是下载Android源码,删除这些异常,然后重新编译成Jar包供使用。在Google的文章里提供了一个Android包,但是比较旧,有可能没法用。这里有个稍微新点的,但是不知道其版本号(http://www.4shar(_)ed.com/get/KWwSl5an/android.html)(把(_)去掉)。
6. 这一步尤其重要,我们得把这几个Jar包排好序,不然可能编译不通过。同样在Java Build Path里选择Order and Export,把这些Jar包按下面的顺序排部:
至此,使用PowerMock的Android Junit环境我们就配置好了,接下来就可以写单元测试了~
参考资料
PowerMock on Android (Google Solution)
Mocking Android System Objects using PowerMock
如果您看了本篇博客,觉得对您有所收获,请点击下面的 [推荐]
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境的更多相关文章
- 简单谈谈eclipse下搭建PhoneGap环境来开发Android程序 - linux86(转)
原来在逛园子的时候一不小心发现了一个新概念“PhoneGap”简称PG,我一直都喜欢追逐新事物,自然就产生了好奇心.于是乎我就在百度上面Google了一下PhoneGap是什么东西.简单的说就是用另一 ...
- Android studio 搭建测试环境 创建虚拟机
1.打开android studio2.0 ,选择AVD Manger 2.选择Create Virtual Device 3.在左侧Category中选择Phone,然后选择自己喜欢的手机型号,点击 ...
- java-cef系列视频第二集:搭建开发环境
上一集我们介绍了如何从官方代码编译java-cef. 本视频介绍了如何使用eclipse搭建java-cef二次开发环境. 下一集我们将给java-cef添加flash支持. 本作品采用知识共享署名- ...
- 流程引擎Activiti系列:在eclipse中搭建咖啡兔的Activiti演示工程中的各种坑及其解决方法(kft-activiti-demo-no-maven)
近期在学习activiti,打算基于现有的框架,比如activiti-explorer或者咖啡兔的示例工程 kft-activiti-demo,在此基础上添加自己的业务流程,看看是否可以走通,以及这个 ...
- Android配置时,点击eclipse里Window->Preferences里的android选项出错
An error has occurred when creating this preference page. 解决方法:重起eclipse
- Android开发系列之搭建开发环境
接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工 ...
- Android拓展系列(11)--打造Windows下便携的Android源码阅读环境
因为EXT和NTFS格式的差异,我一直对于windows下阅读Android源码感到不满. 前几天,想把最新的android5.0的源码下下来研究一下,而平时日常使用的又是windows环境,于是专门 ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- [转]Android Studio系列教程六--Gradle多渠道打包
转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...
随机推荐
- Partition算法剖析
博文链接:http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 对,我是来骗访问量 ...
- Readprocessmemory使用方法
函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有訪问权限. 函数原型:BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddr ...
- Hive数据导入
可以通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表. ...
- Gitolite轻松部署/管理git server
对于今天越来越受欢迎的Git,相信做开发的朋友都基本有所耳闻.它最大的便利就是分布式的开发库,让使用git作为源码管理库的开发者可以在本地提交代码的修改而不用提交到远程的库,同时需要和团队协作.同步代 ...
- Change Fragment layout on orientation change
Warning: this may be a pre-Lollipop answer. A Fragment doesn't get re-inflated on configuration chan ...
- 删除右键菜单的“用阿里旺旺发送此文件”项
在运行对话框里的输入框内输入Regedit.exe,点击确定按钮就启动了注册表编辑器程序. 在注册表编辑器窗口左侧展开HKEY_CLASSES_ROOT\CLSID{0DE1378D-F811-40E ...
- Java基础知识强化之集合框架笔记22:List集合的三个子类的特点(面试题)
1. List:(面试题List的子类特点)(1)ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高.(2)Vector: 底层数据结构是数组,查询快,增删慢. 线程安全, ...
- Maven学习总结——聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- Java 原始数据类型转换
在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题: int a = -1; 我们经过多重转换之后:int b = (int)(char)(byte) a ...
- gamit10.6问题汇总
1.在处理精密星历时,提示:old version of file not supported (name svnav.dat) 解决办法:在gamit10.5中不会出现这个问题,10.6中的官方文档 ...