2016-09-21 143 views
3

我有一個圖像加載器類,我想測試一些靜態方法。由於Mockito不支持靜態方法,所以我切換到Power Mockito。然而我正在測試的靜態方法有一個方法調用Power Mockito返回錯誤org.powermock.api.mockito.ClassNotPreparedException

Base64.encodeToString(byteArray, Base64.DEFAULT); 

嘲笑這我使用mockStatic方法如下。

PowerMockito.mockStatic(Base64.class); 

但Android工作室返回給我仍然返回錯誤如下。

org.powermock.api.mockito.ClassNotPreparedException:類 android.util.Base64不是測試製備。要準備此課程,請將 類添加到'@PrepareForTest'註釋中。

以下是我的完整代碼。

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Base64.class}) 
public class ImageLoaderTest { 
@Test 
    public void testConvertBitmap(){ 
    byte[] array = new byte[20]; 
    PowerMockito.mockStatic(Base64.class); 
    PowerMockito.when(Base64.encodeToString(array, Base64.DEFAULT)).thenReturn("asdfghjkl"); 
    Bitmap mockedBitmap= PowerMockito.mock(Bitmap.class); 
    String output = ImageLoaderUtils.convertBitmapToBase64(mockedBitmap); 
    assert (!output.isEmpty()); 
} 

}

搖籃相依

testCompile 'junit:junit:4.12' 
testCompile 'org.powermock:powermock:1.6.5' 
testCompile 'org.powermock:powermock-module-junit4:1.6.5' 
testCompile 'org.powermock:powermock-api-mockito:1.6.5' 

回答

0

雖然我不知道肯定不,Android的工作室可以使用系統類加載器爲Android課程,這就需要你use the same workarounds as for system classes

在幕後,Powermock使用一個特殊的類加載器來重寫你準備的類,以這種方式Mockito或EasyMock可以存根/驗證私有/靜態/最終方法,而沒有特殊的類加載Mockito和EasyMock通常依賴代理子類這將您限制爲可見的可覆蓋實例方法。但是,不可能覆蓋由系統類加載器加載的類,因爲官方實現已經被加載並且不能被替換或增強。 Powermock反而會準備/重寫與系統類交互的類,因此可以攔截呼叫並將其重定向到您選擇的模擬框架。另外,雖然它似乎只是一個術語問題,但是你說你想「測試一些靜態方法」,而「Mockito不支持靜態方法」。您可以在測試靜態方法時使用Mockito,但不能像使用Base64.encodeToString一樣使用Mockito來驗證或存根(替代實現)靜態方法;這就是你需要PowerMock的地方,就像你在這裏做的那樣。注意不要模擬被測試的系統,否則你可能會測試你的模擬行爲,而不會真正測試任何真實的系統。