web-dev-qa-db-ja.com

Android Base64エンコードおよびデコードはユニットテストでnullを返します

http://developer.Android.com/reference/Android/util/Base64.html クラスを使用してAndroid)でBase64でエンコードされた文字列をデコードしようとしています。

EncodeToStringメソッドとdecodeメソッドの両方がnullを返していますが、何が問題なのかわかりません。デコードのコードは次のとおりです。

// Should decode to "GRC"
String friendlyNameBase64Encoded = "R1JD";

// This returns null
byte[] friendlyNameByteArray = Base64.decode(friendlyNameBase64Encoded, Base64.DEFAULT);

// Fails with NullPointerException
String friendlyName = new String(friendlyNameByteArray, "UTF-8");

私は実行していますAndroid API 23.1.0

18
brnby

ユニットテストでも同じ問題が発生しました。使用しているBase64クラスがAndroid APIの一部であることに気づかなかったため、

通常のJUnitテストでAndroid.util.Base64を使用することはできません。インストルメンテーションテストである必要があります。

ただし、単体テストとして本当に必要な場合は、代わりにApache CommonsBase64クラスを使用できます。 Gradleビルドに含める:

// https://mvnrepository.com/artifact/org.Apache.commons/commons-collections4
compile group: 'org.Apache.commons', name: 'commons-collections4', version: '4.1'

そして、わずかに異なる使用法、

22
ScottyC

RobolectricRunnerを使用できます

  1. build.gradleに依存関係を追加します。

    testCompile 'org.robolectric:robolectric:X.X.X'
    
  2. テストクラスに次の行を追加します。

    import org.junit.runner.RunWith;
    import org.robolectric.RobolectricTestRunner;
    
    @RunWith(RobolectricTestRunner.class)
    public class MyTestingClassTest {
        ...
    }
    
5
rsommerard

フォローアップo Androidチュートリアルとユニットテストノート、いくつかのAndroid libsを使用せずにユニットテストのみが必要です

あなたの場合、あなたはAndroid.Base64に依存しています。同様の問題が発生し、テストクラスをsrc/test-> src/androidTestから移動しても機能しました。これらのテストは、仮想マシンまたは実際のAndroidデバイスで実行されます。最初は違いに気づきませんでした。

4
lukassos

説明したように、Android.util.Base64.decodeは、ビルドファイルの次の設定のために、テストハーネスでnullを返します。

testOptions {
    unitTests.returnDefaultValues = true
}

他のライブラリが含まれないようにするには、Java8およびAndroid 26以降でのみ使用可能なJava.util.Base64にフォールバックできます。すでに26以上をターゲットにしている場合は、このメソッドに切り替えてください。ただし、以前のSDKをターゲットにする必要がある場合は、nullリターンを確認し、代わりにtest-harnessメソッドを呼び出すことができます。

// Required because Android classes return null in desktop unit tests
@TargetApi(26)
private fun testHarnessDecode(s : String) : ByteArray {
    return Java.util.Base64.getDecoder().decode(s)
}

追加のライブラリ依存関係を取得するよりも、これを実行したいのですが、YMMVです。

3
Rupert Rawnsley