2016-10-28 31 views
2

私の目標は、Build.Version.SDK_INTをMockitoでモックすることです。既に試しました: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を入力することを忘れないでください。 - テスト – Nkosi

+0

おそらく..? あなたはあまりにも激しくモックしようとしているようです。そのintを読み取るコード行のコードカバレッジを取得しようとしている場合、なぜですか? 異なるビルドで異なる動作をするようにシステムを設定しようとしている場合は、CANモックの何かの背後にある '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(); 
} 

、その後PowerMockitoを使用しながら、これは私のために動作するクラス/インタフェース

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

優秀 - それはずっと清潔な解決策です – Ash

2

をあざけります。

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

@PrepareForTest({Build.VERSION.class})