我正在尝试为此处解密的方法编写一个测试用例。
private static Codec codec;
static {
try {
codec = new Codec(encryptionType, encryptionKey, false, true, false);
} catch (CodecException e) {
throw new RuntimeException("Codec initialisation failed", e);
}
}
public static String decrypt(final String toDecrypt) throws CodecException {
String decrypted = codec.decryptFromBase64(toDecrypt);
if (decrypted.endsWith(":")) {
decrypted = decrypted.substring(0, decrypted.length() - 1);
}
return decrypted;
}
测试用例:
@Mock
private Codec codec;
@Test
public void test_decrypt_Success() throws CodecException {
when(codec.decryptFromBase64(TestConstants.toDecrypt)).thenReturn(TestConstants.decrypted);
assertEquals(DocumentUtils.decrypt(TestConstants.toDecrypt), TestConstants.decrypted);
}
由于这是一个静态方法,我无法在测试套件中注入该类的实例并模拟其编解码器。上面的代码按预期在 assert 处从编解码器库中抛出错误。
您测试此类静态方法的方法是什么?还是我根本不应该为此编写测试?
原文由 tanvi 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Java 中,静态方法并不是为了设置依赖而设计的。
因此,将依赖项转换为 mock 确实不自然。
您可以为该字段提供
static
设置器,例如:你可以设置一个模拟
setCodec(...)
但是呃…但是忘了,把事情做好:重构代码以删除所有静态并引入一个设置编解码器的构造函数。
IOC 可以在这里帮助使被测类成为单例并简化依赖注入。
如果在您的情况下不可能,Java 5 枚举至少可以帮助您解决单例问题。