web-dev-qa-db-ja.com

AndroidでBase64をモックする方法は?

_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_を正しくモックするにはどうすればよいですか?

6
O.O.Balance

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 に互換性のあるバージョンの詳細を示す表があります。

7
O.O.Balance

私は遅れていますが、多分それは誰かを助けるでしょう。 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...
}
2
ruchkin