我的单元测试失败,android.util.Log中的方法d没有被模拟,但只有当我运行testDebug时。 如果运行testRelease一切正常,他们正确通过。 有谁知道为什么会这样? 从控制台和Android工作室运行gradle时也会发生同样的事情。
答案 0 :(得分:2)
以下是我如何解决这个问题以供将来参考的解释。 在调试中工作但未发布的测试问题是由于Log.d(以及来自android框架的朋友)没有被正确模拟的事实。 构建为release时它工作的原因是我们的loging是基于build config的这个属性有条件的。基本上我们有if(BuildConfig.type!=" Release")Log.d(...),因为编译器由于最终值而删除了这个块,所以在测试发布时它不会被调用。 要模拟静态方法Log.d,我使用了PowerMock。模拟很容易,但设置Power Mock确实很麻烦,因此可能有更多方法可以做到。
答案 1 :(得分:0)
Android Studio项目网站上的结帐"Method ... not mocked"链接。 它说:
用于运行单元测试的android.jar文件不包含任何实际代码 - 由真实设备上的Android系统映像提供。相反,所有方法都抛出异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖于Android平台的任何特定行为(您没有明确嘲笑,例如使用Mockito)。如果证明有问题,可以将下面的代码段添加到build.gradle中以更改此行为:
build.gradle
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
我们知道在使用Log或TextUtils等类时,默认行为是有问题的,并且会在将来的版本中评估可能的解决方案。
我刚刚使用上面的内容来摆脱异常。