ユニットテストの静的メソッド

tanvi:

私はここの方法を復号化のためのテストケースを記述しようとしています。

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

この静的メソッドであるため、私は、テストスイート内のクラスのインスタンスを注入し、そのコーデックを模擬することができません。予想されるように上記のコードは、アサートで、コーデックライブラリからエラーがスロー。

このような静的メソッドをテストするあなたのアプローチは何ですか?それとも私はすべてで、このためにテストを書くべきではありませんか?

davidxxx:

Javaでは、静的メソッドは、一連の依存関係に設計されていません。
モックに依存関係を切り替えて、本当に自然ではありません。
あなたは提供することができstatic、フィールドなどのためのセッターを:

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は、テストAシングルトン下のクラスを作成し、依存性の注入を容易にするためにここに助けることができます。
あなたのケースでは不可能場合は、Java 5の列挙は、少なくともシングルトンの懸念のためにあなたを助けることができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186948&siteId=1