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
ユニットテストでも同じ問題が発生しました。使用している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'
そして、わずかに異なる使用法、
Base64 . decodeBase64(String base64String)
RobolectricRunnerを使用できます
build.gradle
に依存関係を追加します。
testCompile 'org.robolectric:robolectric:X.X.X'
テストクラスに次の行を追加します。
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class MyTestingClassTest {
...
}
フォローアップo Androidチュートリアルとユニットテストノート、いくつかのAndroid libsを使用せずにユニットテストのみが必要です
あなたの場合、あなたはAndroid.Base64に依存しています。同様の問題が発生し、テストクラスをsrc/test
-> src/androidTest
から移動しても機能しました。これらのテストは、仮想マシンまたは実際のAndroidデバイスで実行されます。最初は違いに気づきませんでした。
説明したように、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です。