junit Android Base64编码和解码在单元测试中返回空值

pgccezyw  于 2022-11-11  发布在  Android
关注(0)|答案(6)|浏览(180)

我正在尝试使用http://developer.android.com/reference/android/util/Base64.html类在Android中解码Base64编码字符串。
encodeToString和decode方法都返回空值,我不知道是哪里出了问题,下面是我的解码代码:

// 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

rqqzpn5f

rqqzpn5f1#

我在单元测试中也遇到了同样的问题。我没有意识到我使用的Base64类是Android API的一部分,因此

您不能在常规JUnit测试中使用android.util.Base64,它必须是一个工具测试。

但是,如果您真的希望将其作为单元测试,您可以使用Apache Commons Base64类。

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

用法稍有不同,

  • Base64.encodeBase64字符串(字节[]二进制数据)
  • (字符串base64字符串)
zed5wv10

zed5wv102#

你可以用机器人跑步机
1.在build.gradle中添加依赖项:

testCompile 'org.robolectric:robolectric:X.X.X'

1.在测试类中添加以下行:

import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

@RunWith(RobolectricTestRunner.class)
public class MyTestingClassTest {
    ...
}
0g0grzrc

0g0grzrc3#

跟进o android教程和单元测试说明,而你只需要单元测试,而不需要使用一些android库
在你的情况下,你依赖于android.Base64。我有类似的问题,移动测试类从src/test-〉src/androidTest工作。这些测试运行在虚拟机或真实的的android设备。我没有注意到差异,在第一眼。

zrfyljdw

zrfyljdw4#

如前所述,由于构建文件中的此设置,android.util.Base64.decode将在测试工具中返回空值:

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。

sg3maiej

sg3maiej5#

我的工作方式是使用mockk来模拟Base64.decode方法

mockkStatic(Base64::class)
 every { Base64.decode(any<String>(),Base64.DEFAULT) } returns byteArrayOf()
8i9zcol2

8i9zcol26#

我最终做的是一个 Package 器。我允许android.util.Base64失败,然后如果我们在构建大于“O”或等于0(零。意味着不是Android设备或没有Android SDK版本)。

class Base64Wrapper {
    companion object {
        fun encodeToString(input : ByteArray) : String {
            return try {
                Base64.encodeToString(input, Base64.DEFAULT)
            } catch (e :Exception) {
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O || android.os.Build.VERSION.SDK_INT == 0) {
                    java.util.Base64.getEncoder().encodeToString(input)
                } else {
                    throw e;
                }
            }
        }

        fun decode(input: String) : ByteArray {
            return try {
                Base64.decode(input, Base64.DEFAULT)
            } catch (e :Exception) {
                // if build is greater or equal to "O" or is equal to 0 (zero) which means it is not a device (i.e. unit test).
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O || android.os.Build.VERSION.SDK_INT == 0) {
                    java.util.Base64.getDecoder().decode(input)
                } else {
                    throw e;
                }
            }
        }
    }
}

相关问题