我正在尝试使用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
答案 0 :(得分:18)
我的单元测试中遇到了同样的问题。我没有意识到我正在使用的Base64类是Android API的一部分,因此
你不能在常规的JUnit测试中使用android.util.Base64,它必须是一个Instrumentation测试。
但是,如果您真的希望将其作为单元测试,则可以使用Apache Commons Base64类。将它包含在Gradle构建中:
// https://mvnrepository.com/artifact/org.apache.commons/commons-collections4
compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.1'
然后用法略有不同,
答案 1 :(得分:4)
跟踪o android教程和单元测试笔记,而你只需要单元测试而不使用一些android库
在你的情况下,你依赖于android.Base64。我有类似的问题,并从src/test
移动测试类 - > src/androidTest
工作了。这些测试在虚拟机或真正的Android设备上运行。第一次看时我没注意到差异。
答案 2 :(得分:2)
您可以使用Robolectric Runner
在build.gradle
中添加依赖项:
testCompile 'org.robolectric:robolectric:X.X.X'
在测试类中添加以下行:
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class MyTestingClassTest {
...
}
答案 3 :(得分:0)
如前所述,由于构建文件中的以下设置,android.util.Base64.decode在测试工具中返回了null:
testOptions {
unitTests.returnDefaultValues = true
}
为避免包含其他库,您可以使用java.util.Base64,该库仅在Java8和Android 26及更高版本中可用。如果您已经定位到26岁以上的人,则只需切换到该方法即可,但是如果您必须定位较早的SDK,则可以检查是否为空,并调用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。