在网上找到一份写得挺不错的Android单元测试的详细教程,作者是小创,在SegmentFault他的主页可以看到他写的文章,不过目测这些文章也是从他的个人主页同步过来的。我已阅读的篇章如下:
Android 单元测试: 首先,从是什么开始
Android单元测试(二):再来谈谈为什么
Android单元测试(三):JUnit单元测试框架的使用
Android单元测试(四):Mock以及Mockito的使用
Android单元测试(五):依赖注入,将mock方便的用起来
Android单元测试(六):使用dagger2来做依赖注入,以及在单元测试中的应用
Android单元测试(七):Robolectric,在JVM上调用安卓的类
按照文章内容,我总结如下:
“单元测试,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码”:
- 方法有返回值(包括异常):使用JUnit框架
- 方法无返回值:
1) 策略:mock, spy
2) 框架:Mockito。用途:1. 验证方法调用 2. 指定mock对象的某些方法行为,方法有返回值与无返回值不同处理。
mock需要进行依赖注入
方法:1. setter injection 2. argument injection *3. constructor injection
框架:Dagger2(必要时才用),原理:
- 生产Dependency的工厂:Module
- Dependency工厂管理员:Component
Component给Client提供Dependency的方法:
- 在Component里面定义一个返回Dependency的方法
- Field Injection
Robolectric:在JVM上调用Android的类,协助进行Android单元测试。
不过,在实际编写代码时,也遇到不少问题:
- 文章中提到几个框架,分别是JUnit, Mockito, Dagger, Robolectric,配置方法:
版本号会更新,详见官网。testCompile 'junit:junit:4.12' testCompile "org.mockito:mockito-core:2.+" testCompile "org.robolectric:robolectric:3.4.2"
- 作者在介绍Dagger时,定义了AppComponent后,对应的自动生成类叫做DaggerAppComponent。
作者没说这个是怎么才能生成的,其实可以点击工具栏上的Make Project,或者快捷键Ctrl+F9,其实这就是一个编译的过程。 - 在运行Robolectric测试前,Android Studio会下载Robolectric的jar包等,然而这个可能因为某些你懂得的原因而下载奇慢,解决方法见加速Robolectric下载依赖库及原理剖析。
- 在用Robolectric测试时,出现找不到AndroidManifest.xml的报错,解决方案见Stack Overflow。
- 在用Robolectric测试时,出现找不到android.content.pm.ShortcutManager的类文件这么一个错误,在Android API官网可以找到这个类是在API level 25才添加的,而项目的compileSdkVersion是23。我也不清楚怎么会去找这个类,估计是因为我用了最新的Robolectric,而它要求最新的Android接口吧。将compileSdkVersion改成25解决。
- 文中的示例代码中有一句:
然而这句话是肯定会报错的,因为看assertEquals的源码可以发现判断相等的依据是expected.equals(actual),这对于Intent来说就是要同一个对象的不同引用才会相等。Assert.assertEquals(expectedIntent, actualIntent);
解决方法可以参考Stack Overflow或者Writing Your First Test | Robolectric。