我实现了一个非常简单的类,该类Enigma
具有一个对称密钥和两个方法:byte[] encryptString(String strToEncrypt)
和String decryptBytes(byte[] arrayToDecrypt)
。
我正在尝试为该方法编写一些测试。我已经考虑过测试,加密和解密方法彼此相反,但这并不能单独说明它们。我想按原样使用这些方法来获取一组输入输出,并将其设置为测试(我知道这不是理想的方法,但是这些测试的目的是为了确保该函数在将来能够像它那样运行今天,不是说加密/解密就不错了)。
但是,我不知道如何获取字节数组输出的表示形式,byte[] encryptString(String strToEncrypt)
以便可以在测试类中对其进行硬编码。
有任何想法吗?
关于如何测试的一些注意事项(个人意见警告:-))
如果您正在编写单元测试,请避免从文件中读取预期的结果,因为这会减慢测试速度(单元测试必须非常快),并创建与您的代码无关的另一件事,这可能会出错(即文件可能删除等)
不要使用您正在测试的相同方法来创建预期结果,以用于检查该方法。如果您要检查算法,这毫无意义,并且可能会使算法中的错误永久存在
考虑一下Java中最小的工作单元是一个类,而不是一个方法的事实(有关Java 8的lambda表达式,请记住一秒钟,您不会真正直接为它们编写单元测试),因此,您应该尝试测试类,而不是方法
我的最后一点建议我(最后是?)。考虑一下班级的职责(希望是单一职责,请参阅SRP)。在这种情况下,我相信您的课程的责任是字符串的两种加密方式。
因此,我将编写以下测试:
@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); }
也许添加更多测试以检查尝试加密/解密无效值会引发异常和其他错误情况。