2015-09-18 55 views
5

我的单元测试失败,android.util.Log中的方法d没有被模拟,但只有当我运行testDebug。 如果运行testRelease一切正常,并且它们正确传递。 有谁知道为什么会发生这种情况? 从控制台和Android Studio运行gradle时会发生同样的情况。Android单元测试失败调试生成类型

回答

1

下面是我解释这个如何为将来的参考。 测试工作在调试但未发布的问题是由于Log.d(以及来自android框架的朋友)未正确模拟的事实。 构建为发布版时,其工作原因是我们的日志记录基于build config中的此属性进行了有条件的处理。基本上我们有if(BuildConfig.type!=“Release”)Log.d(...),并且由于编译器因最终值而删除了该块,所以在测试发布时它不会被调用。 模拟静态方法Log.d我使用了PowerMock。嘲笑很容易,但设置Power Mock真的很麻烦,所以可能会有更多的方法来做到这一点。

0

结帐"Method ... not mocked"在Android Studio项目网站上的链接。 它说:

用来运行单元测试不包含任何实际的代码的android.jar文件 - 由Android系统的图像在实际设备上提供。相反,所有方法都会引发异常(默认情况下)。这是为了确保您的单元测试只测试您的代码,并且不依赖于Android平台的任何特定行为(您未明确嘲笑例如使用Mockito)。如果这个被证实有问题的,你可以在下面添加片段到您的build.gradle改变这种行为:

build.gradle 
    android { 
    // ... 
    testOptions { 
     unitTests.returnDefaultValues ​​= true 
    } 
} 

我们都知道,默认行为使用类,如日志或文本实用程序,并就当是有问题评估未来版本中的可能解决方案

我刚刚使用上述摆脱了现在的例外。