gpt4 book ai didi

java - 单元测试静态方法

转载 作者:行者123 更新时间:2023-11-28 19:56:28 25 4
gpt4 key购买 nike

我正在尝试为此处解密的方法编写一个测试用例。

    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);
}

由于这是一个静态方法,我无法在测试套件中注入(inject)该类的实例并模拟其编解码器。上面的代码按预期在 assert 处从编解码器库中抛出错误。

你用什么方法来测试这样的静态方法?或者我根本不应该为此编写测试吗?

最佳答案

在Java中,静态方法并不是为了设置依赖而设计的。
所以将依赖转换为 mock 真的很不自然。
您可以为该字段提供一个 static setter,例如:

private static Codec codec;
public static void setCodec(Codec codec){
this.codec = codec;
}

你可以用 setCodec(...) 设置一个 mock 但是呃...

但是忘记了,把事情做好:重构代码以删除所有静态并引入一个设置编解码器的构造函数。

private Codec codec;
public MyClassUnderTest(Codec codec){
this.codec codec;
}

IOC 在这里可以帮助使被测类成为单例并简化依赖注入(inject)。
如果在您的情况下不可能,Java 5 枚举至少可以帮助您解决单例问题。

关于java - 单元测试静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com