0

我有一个单元测试,我试图为一个generateKey(int **length**)方法编写。方法: 1. 创建一个大小为输入参数长度的字节数组 2. 使用 SecureRandom().nextBytes(randomKey) 方法用随机值填充字节数组 3. 将填充有随机值的字节数组编码为 UTF-8字符串对象 4. 将原始字节数组(称为randomKey)重写为 0 以确保安全 5. 返回 UTF-8 编码的字符串

我已经有一个单元测试检查用户输入一个负值(即-1),这样字节数组会抛出一个负数组大小异常。

一个好的正面测试用例是检查 UTF-8 编码的字符串是否已成功创建有没有一种方法可以调用生成的字符串来检查它是否等于“UTF-8”编码?

我无法检查字符串是否等于相同的字符串,因为每次调用字节数组时都会填充随机值......

源代码在这里:

public static String generateKey(int length) {
    byte[] randomKey = new byte[length];
    new SecureRandom().nextBytes(randomKey);
    String key = new String(randomKey, Charset.forName("UTF-8"));//Base64.getEncoder().encodeToString(randomKey);
    Arrays.fill(randomKey,(byte) 0);
    return key;
}
4

2 回答 2

0

您可以将 UTF8 字符串转换为字节数组,如下所示

String str = "私の";  // replace this with your generateKey result
byte [] b = str.getBytes();
String newString;
try {
    newString = new String (b, "UTF-8");
    System.out.println(newString);

    System.out.println("size is equal ? " + (str.length() == newString.length()));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
于 2020-02-10T02:48:25.703 回答
0

首先,您发布的代码完全是错误的:您不能将随机的字节数组视为 UTF-8 字符串,因为UTF-8需要某些位模式来指示多字节字符。

不幸的是,这个失败是静默发生的,因为你使用的字符串构造函数“总是用这个字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列”。所以你会得到一些东西,但你不能把它翻译回相同的二进制值。

然而,代码中的注释为您提供了答案:您需要使用 Base64 对二进制值进行编码。

但是,这仍然不能让您验证编码的字符串是否等同于原始字节数组,因为该函数非常注意在使用后立即将数组归零(这并没有真正做到作者认为的那样,但我不打算进入那个论点)。

如果你真的想测试这样的方法,你需要能够模拟出它的核心部分。例如,您可以将随机字节的生成与编码分开,然后传入一个字节生成器来跟踪它生成的字节。

但真正的问题是为什么?您(或更准确地说,是编写此代码的人)实际上想要完成什么?为什么 UUID 不能完成它?

于 2020-02-10T15:05:26.783 回答