_Android.util.Base64
_を使用するクラスの単体テストを作成していますが、次のエラーが発生します。
_Java.lang.RuntimeException: Method encode in Android.util.Base64 not mocked. See http://g.co/androidstudio/not-mocked for details.
at Android.util.Base64.encode(Base64.Java)
_
これは、encode()
メソッドを使用するコードです。
_ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// [write some data to the stream]
byte[] base64Bytes = Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
_
これで、ユニットテストでAndroidライブラリクラスを使用できないことがわかりました。しかし、クラスの正しいユニットテストを記述できるように、_Base64
_を正しくモックするにはどうすればよいですか?
NkosiとChristopherのコメントに基づいて、私は解決策を見つけました。 PowerMockを使用して、Base64
の静的メソッドをモックしました。
PowerMockito.mockStatic(Base64.class);
when(Base64.encode(any(), anyInt())).thenAnswer(invocation -> Java.util.Base64.getEncoder().encode((byte[]) invocation.getArguments()[0]));
when(Base64.decode(anyString(), anyInt())).thenAnswer(invocation -> Java.util.Base64.getMimeDecoder().decode((String) invocation.getArguments()[0]));
そして、私のbuild.gradle
に次を追加する必要がありました。
testImplementation "org.powermock:powermock-module-junit4:1.7.4"
testImplementation "org.powermock:powermock-api-mockito2:1.7.4"
PowermockのすべてのバージョンがMockitoのすべてのバージョンで機能するわけではないことに注意してください。ここで使用したバージョンは、Mockito 2.8.0-2.8.9
で動作するはずであり、問題はありません。ただし、Mockito2のサポートはまだ実験段階です。 プロジェクトのwiki に互換性のあるバージョンの詳細を示す表があります。
私は遅れていますが、多分それは誰かを助けるでしょう。 JUnitの場合、サードパーティのライブラリなしでクラスをモックアップできます。 app/src/test/Java/Android/util内に次の内容のファイルBase64.Javaを作成するだけです。
package Android.util;
public class Base64 {
public static String encodeToString(byte[] input, int flags) {
return Java.util.Base64.getEncoder().encodeToString(input);
}
public static byte[] decode(String str, int flags) {
return Java.util.Base64.getDecoder().decode(str);
}
// add other methods if required...
}