单元测试静态方法

loading...


2

我正在尝试为此方法解密一个测试用例 .

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

由于这是一个静态方法,我不能在测试套件中注入该类的实例并模拟其编解码器 . 上面的代码在断言时从编解码器库中抛出错误 .

您测试静态方法的方法是什么?或者我不应该为此编写测试?

loading...

3回答

  • 3

    实现相同的方法有许多不同的和快捷方式(如评论和其他答案中所指出的那样),但从长远来看并非所有这些方法都是好的 .

    我建议创建一个实现Decrypt功能的Singleton类 . 因此,您不必创建多个实例,也不需要使用静态方法进行解密,并且您可以轻松地注入编解码器(我假设您没有多种类型的编解码器作为根据你的意见 . 但是,如果你这样做,那么功能应相应调整) .

    欲了解更多信息:Why use a singleton instead of static methods?

    有关为何应谨慎使用静电的参考: - Why are static variables considered evil?


  • 2

    根据我在这些情况下的经验,我只是在@Before方法中准备所有实例:

    private Codec codec;
    
    @Before
    public void setup() throws CodecException {
      codec = new Codec(encryptionType, encryptionKey, false, true, false);
    }
    

  • 0

    在Java中,静态方法不是为设置依赖项而设计的 .
    因此将依赖关系转换为模拟实际上并不自然 .
    您可以为该字段提供 static setter,例如:

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

    你可以用 setCodec(...) 设置一个模拟但是......

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

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

    IOC可以在这里帮助使被测试的课程成为单身人士,并减轻依赖注入 .
    如果在您的情况下不可能,Java 5枚举可以帮助您至少解决单例问题 .

评论

暂时没有评论!