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