【发布时间】:2017-01-14 03:58:54
【问题描述】:
免责声明,我是一名 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 算法。我想测试.doFinal(message) 中的message 是否遵循特定格式等。
现在我想我可以模拟Cipher 类,这里的问题是编写的加密和解密仅用作 Util 类并且能够对此进行单元测试,我会将模拟 Cipher 传递到代码中,鉴于这是一个 Util 类,它似乎会变得混乱,即我必须创建一个 init 方法 just 用于单元测试目的或创建 setter方法只是对这个进行单元测试。这将允许我对代码进行单元测试,但是 Util 类会变得笨拙,而我实际上不需要用于生产目的的代码。
有没有什么优雅的方法可以对这样的场景进行单元测试?即encryptedInputData 和decryptData 是公共方法,但这些方法使用各种私有方法,坦率地说需要进行单元测试,那么问题是如何?
【问题讨论】:
标签: java android unit-testing encryption