Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-为单元测试检查字符串编码?_Java_Unit Testing_Junit_Passwords - Fatal编程技术网

Java-为单元测试检查字符串编码?

Java-为单元测试检查字符串编码?,java,unit-testing,junit,passwords,Java,Unit Testing,Junit,Passwords,我试图为generateKey(int**length**)方法编写一个单元测试。方法: 1.创建一个字节数组,其大小为输入参数length 2.使用SecureRandom().nextBytes(randomKey)方法用随机值填充字节数组 3.将填充随机值的字节数组编码为UTF-8字符串对象 4.为安全起见,将原始字节数组(称为randomKey)重新写入0 5.返回UTF-8编码的字符串 我已经有一个单元测试检查用户输入负值(即-1),这样字节数组就会抛出一个负数组大小异常 好的肯定测试

我试图为
generateKey(int**length**)
方法编写一个单元测试。方法: 1.创建一个字节数组,其大小为输入参数length 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;
}

可以将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();
}

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

不幸的是,此失败会悄无声息地发生,因为您使用的字符串构造函数“总是用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列”。所以你会得到一些东西,但你无法将它转换回相同的二进制值

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

但是,这仍然不能让您验证编码的字符串是否与原始字节数组等效,因为函数在使用后会非常小心地立即将数组归零(这实际上并不像作者所认为的那样,但我不打算讨论这个参数)

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


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

为什么?您应该将密钥作为字节数组传递。字符串不是二进制数据的容器。哦,你建议写一个测试来检查字节数组是否成功创建?我不确定我是否明白你在说什么。我上面解释的源代码来自,源代码,我的任务只是为它编写单元测试,所以我不应该真的更改源代码。我肯定你没有理解我,但是如果你不将字节数组转换成字符串,您不需要编写测试来查看转换是否正确。是否有方法“获取”字符串的编码?三秒钟后