Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Bytearray_Junit4 - Fatal编程技术网

Java 加密/解密的单元测试

Java 加密/解密的单元测试,java,unit-testing,junit,bytearray,junit4,Java,Unit Testing,Junit,Bytearray,Junit4,我实现了一个非常简单的类,名为Enigma,它有一个对称密钥和两种方法:byte[]encryptString(String StrotEncrypt)和String decryptBytes(byte[]ArrayDecrypt) 我正在尝试为这些方法编写一些测试。我曾考虑过测试加密和解密方法是否彼此相反,但这并不能单独说明它们。我想像现在这样使用这些方法来获得一组输入输出,并将其设置为测试(我知道这并不理想,但这些测试的目的是确保函数在将来的行为与今天一样,而不是确保加密/解密良好) 但是,

我实现了一个非常简单的类,名为
Enigma
,它有一个对称密钥和两种方法:
byte[]encryptString(String StrotEncrypt)
String decryptBytes(byte[]ArrayDecrypt)

我正在尝试为这些方法编写一些测试。我曾考虑过测试加密和解密方法是否彼此相反,但这并不能单独说明它们。我想像现在这样使用这些方法来获得一组输入输出,并将其设置为测试(我知道这并不理想,但这些测试的目的是确保函数在将来的行为与今天一样,而不是确保加密/解密良好)

但是,我不知道如何通过
byte[]encryptString(String strotencrypt)
获取字节数组输出的表示形式,以便在测试类中对其进行硬编码


有什么想法吗?

关于如何测试这一点的一些注意事项(个人意见警告:-)

  • 如果您正在编写单元测试,请避免从文件中读取预期结果,因为这会减慢测试速度(单元测试必须非常快),并创建另一个可能出错的与代码无关的内容(例如,文件可能被删除等)
  • 不要使用与您正在测试的方法相同的方法来创建用于检查方法的预期结果。如果您试图检查算法,这是毫无意义的,并且可能会使算法中的错误永久化
  • 考虑到Java中最小的工作单元是一个类,而不是一个方法(暂时忘记Java8的lambda表达式,您不会直接为这些表达式编写单元测试),因此,您应该尝试测试类,而不是方法
我的最后一点(最后?)给了我一个建议。想一想班级的责任是什么(希望是单一责任,请参阅)。在这种情况下,我认为您的类的职责是对字符串进行双向加密。
因此,我将编写以下测试:

@Test
public void testThatEncryptingStringResultsInExpectedBytes() {
    byte[] encryption = enigma.encryptString(TEST_STRING);

    assertArrayEquals(EXPECTED_ENCRYPTION, encryption);
}

@Test
public void testThatDecryptinEncryptionResultsInOriginalString() {
    String decryption = enigma.decryptBytes(TEST_ENCRYPTION);

    assertEquals(EXPECTED_ORIGINAL_STRING, decryption);
}

@Test
public void testThatDecriptionReversesEncryption() {
    String decryption = enigma.decryptBytes(enigma.encryptString(TEST_STRING));

    assertEquals(TEST_STRING, decryption);
}

@Test
public void testThatEncryptionReversesDecryption() {
    byte[] encryption = enigma.encriptString(enigma.decryptBytes(TEST_ENCRYPTION));

    assertEquals(TEST_ENCRYPTION, encryption);
}

可能会添加更多测试,以检查尝试加密/解密无效值是否会引发异常和其他错误情况。

谢谢,这就是我最后所做的(使用在线加密工具以十六进制形式获取结果)。注释和问题:不确定反向测试是否可以应用于每个加密(我想这仅仅对于对称算法来说是有意义的)。我同意读取文件会减慢单元测试的速度,而单元测试的速度应该是闪电般的快。当使用JUnit测试xml生成时,您会如何处理它?关于这方面的任何提示或示例?首先,让我强调一个比缓慢更大的问题(尽管这是一个大问题)在单元测试期间读取文件会导致不一致、重复性损失和隔离性损失。读取文件取决于I/O,这意味着它可能会失败,每次运行可能需要不同的时间等。在测试期间执行I/O操作会阻止它成为单元测试。关于XML生成,请将生成器定义为receiv将输出编写器/流作为构造函数/方法的参数或通过注入。单元测试将提供模拟输出缓冲区。对于简短的回答,很抱歉,注释中的字符数有限制。如果您需要更好的答案,请发布一个问题,我将正确回答。我遇到了相同的问题,但问题是我的加密程序使用随机salt,因此无法预期加密值。