Android 单元测试
Android Studio 和 Android Gradle Plugin 可以让我们脱离 android.jar 直接在 development machine 上执行单元测试。
Unit tests run on a local JVM on your development machine
Gradle 插件会编译 src/test/java 的代码,运行时会用到一个修改过的 android.jar(去掉了所有的 final 修饰符),这样就可以利用多态引入 mocking libraries。
dependencies {
testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:1.9.5"
}
命令行
./gradlew test --continue
等价于
./gradlew testDebug testRelease --continue
其中 --continue 表示即使某个 case 失败了,也会继续执行剩下的 case。
Flavors & Build type
遵守规范
- src/main/java/Foo.java -> src/test/java/FooTest.java
- src/debug/java/Foo.java -> src/testDebug/java/FooTest.java
- src/myFlavor/java/Foo.java -> src/testMyFlavor/java/FooTest.java
“Method … not mocked.”
今天遇到的就是这个问题:
java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked.
加了 mock 依赖后还是搞不定:
testCompile "org.mockito:mockito-core:1.9.5
修改配置,让 mock 方法返回默认值还是不行:
android {
testOptions {
unitTests.returnDefaultValues = true
}
}
结果却是:
We are aware that the default behavior is problematic when using classes like Log or TextUtils and will evaluate possible solutions in future releases.
总结
android.jar是被 mock 过的,所以有些 Android API 返回值可能会不是预期值。- JUnit 本身是针对 java 代码的单测,所以尽量不要用于使用了 Android API 的方法。
- Android Gradle 插件提供的 mocked android.jar 跟我刚开始工作时做过的测试框架原理类似。
留下评论