免责声明,我是一个ios开发人员,一直在android上玩加密。目前,我已经在android中实现了加密,但我在问自己,一个单元如何测试数据的加密和解密?
现在想到的第一个想法是:
String encryptedInputData = encryptedInputData("Hello");
String decryptedData = decryptData(encryptedInputData);
Assert.assertEquals(decryptedData,"Hello");
不过,这项测试有一个缺陷……如果在
encryptedInputData
和decryptData
方法中确实发生了变化,那么这个测试不会告诉我们发生了什么变化,以及为什么现在发生了变化。所以我想写更多的粒度测试。例如,给出这个代码:Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] data = cipher.doFinal(message);
我想确保
cipher
变量在ecb模式下使用rsa算法,没有填充。我想测试一下message
中的.doFinal(message)
是否遵循特定的格式等。现在我可以想象我可以模拟
Cipher
类,这里的问题是编写的加密和解密只作为一个util类,要能够对其进行单元测试,我必须将模拟Cipher
传递到代码中,如果这是一个util类,它看起来会变得很混乱,也就是说,我必须创建一个init方法来进行单元测试,或者创建setter方法来进行单元测试。这将允许我对代码进行单元测试,但随后util类会变得笨拙,因为我实际上不需要用于生产目的的代码。有没有什么优雅的方法可以对这样的场景进行单元测试?即
encryptedInputData
和decryptData
是公共方法,但这些方法使用各种私有方法,坦率地说,这些方法需要进行单元测试,那么问题是如何实现的? 最佳答案
真正的答案是你不该这么做。您永远不应该实现自己的加密例程。不仅很可能出错,还需要做一些非常复杂的事情来确保它实际上不会由于实现问题而被破解(例如,如果if语句的一个分支比另一个分支需要更长的时间来运行,则可以确定检查的值是多少)。您应该始终使用一个开源的、经过良好审查的库。
因为您不是自己实现它,所以不需要对它进行单元测试。图书馆的作者应该是。如果您喜欢,可以将他们的测试套件作为自己的一部分运行,但我认为这是浪费时间—他们在发布之前就运行了,而您实际上最多只需要运行一次。
关于java - Java中的单元测试加密和解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41375108/