我实现了一个名为 Enigma
的非常简单的类,它有一个对称 key 和两个方法:byte[] encryptString(String strToEncrypt)
和 String decryptBytes( byte[] arrayToDecrypt)
.
我正在尝试为这些方法编写一些测试。我想过测试加密和解密方法是彼此相反的,但这并没有说明它们中的每一个。我想像现在一样使用这些方法来获得一组输入输出并将其设置为测试(我知道这并不理想,但这些测试的目的是保证该功能在未来表现得像它一样今天做的,并不是说加密/解密好)。
但是,我不知道如何通过 byte[] encryptString(String strToEncrypt)
获得字节数组输出的表示,以便我可以在测试类中对其进行硬编码。
有什么想法吗?
最佳答案
关于如何测试这个的一些注意事项(个人意见警告:-))
- 如果您正在编写单元测试,请避免从文件中读取预期结果,因为它会减慢测试速度(单元测试必须超快),并创建与您的代码无关的其他可能出错的东西(即文件可能会被删除等)
- 不要使用您正在测试的相同方法来创建您检查该方法所用的预期结果。如果你试图检查算法,这是没有意义的,并且可能使算法中的错误永久存在
- 考虑到 Java 中最小的工作单元是一个类,而不是一个方法(暂时忘记 Java 8 的 lambda 表达式,您不会真正直接为它们编写单元测试),因此,您应该尝试测试类,而不是方法
我的最后一点让我(终于?)提出了一个建议。想想类(class)的职责是什么(希望是单一职责,参见 SRP )。在这种情况下,我相信你的类(class)的责任是字符串的双向加密。
因此,我会编写以下测试:
@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);
}
也许添加更多测试来检查尝试加密/解密无效值是否会引发异常和其他错误情况。
关于java - 加密/解密单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371069/