Android Base64编码和解码在单元测试中返回null

时间:2015-11-21 19:41:28

标签: java android unit-testing junit android-testing

我正在尝试使用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

4 个答案:

答案 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

  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 {
        ...
    }
    

答案 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。