2016-09-21 11 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()); 
} 

}

のGradleは

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のメーカーuse the same workarounds as for system classesにあなたを必要とするAndroidのクラスのためのシステムクラスローダを使用することができます。

Powermockは特別なクラスローダーを使わずに、MockitoやEasyMockがprivate/static/finalメソッドをスタブ/検証できるように特別クラスローダーを使用して準備するクラスを書き直しています。MockitoとEasyMockは、通常プロキシサブクラス可視のオーバーライド可能なインスタンスメソッドに制限されます。ただし、システムクラスローダーによってロードされたクラスを上書きすることはできません。これは、公式の実装が既にロードされており、置換または拡張できないためです。代わりにPowermockはシステムクラスとやりとりするクラスを準備したり書き直したりするので、コールをインターセプトして、選択したモッキングフレームワークにリダイレクトすることができます。

また、ここでは用語の問題であるように思われますが、「静的メソッドをテストする」と「Mockitoは静的メソッドをサポートしない」とします。静的メソッドのテスト中にMockitoを使用することはできますが、Base64.encodeToStringのようにMockitoを使用してスタティックメソッドを検証またはスタブ(実装の置き換え)することはできません。そこではPowerMockが必要です。テスト中のシステムを決して模倣しないように注意してください。そうしないと、実際のシステムを実際にテストすることなく、嘲笑された動作をテストすることができます。

関連する問題