2016-10-28 121 views
2

我的目標是用Mockito模擬Build.Version.SDK_INT。已經嘗試過:Mockito模擬版本版本

final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class); 
doReturn(buildVersion.getClass()).when(buildVersion).getClass(); 
doReturn(16).when(buildVersion.SDK_INT); 

問題是:當模擬後需要方法時,而.SDK_INT不是方法。

+0

http://stackoverflow.com/questions/38074224/stub-value-of-build-version-sdk-int-in-local-unit -test – Nkosi

+0

也許不.. ..? 這似乎是你試圖嘲諷太難。如果您試圖獲取讀取該int的代碼行的代碼覆蓋率,那爲什麼? 如果您試圖讓系統顯示其行爲與不同的構建行爲不同,然後將調用包裝爲'Build',背後可以模擬一些東西。 –

回答

4

到目前爲止,與其他類似的問題看起來像你不得不使用反射。

Stub value of Build.VERSION.SDK_INT in Local Unit Test

How to mock a static final variable using JUnit, EasyMock or PowerMock

static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true); 

    Field modifiersField = Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

    field.set(null, newValue); 
} 

......然後在這種情況下,像這樣使用...

setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16); 

另一種方法周圍是創建一個訪問類/將該字段包裹在可以稍後被嘲笑的方法中

public interface BuildVersionAccessor { 
    int getSDK_INT(); 
} 

,然後嘲笑那類/接口

BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class); 
when(buildVersion.getSDK_INT()).thenReturn(16); 
+0

極好 - 它是更清潔的解決方案 – Ash

2

同時使用PowerMockito這對我的作品。

Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16); 

不要忘記鍵入

@PrepareForTest({Build.VERSION.class})