2015-09-18 58 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 
    } 
} 

我們都知道,默認行爲使用類,如日誌或文本實用程序,並就當是有問題評估未來版本中的可能解決方案

我剛剛使用上述擺脫了現在的例外。