亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單元測試靜態方法

單元測試靜態方法

慕無忌1623718 2022-03-10 16:50:14
我正在嘗試在這里為方法解密編寫一個測試用例。    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 處從編解碼器庫中引發錯誤。您測試這種靜態方法的方法是什么?還是我根本不應該為此編寫測試?
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

在 Java 中,靜態方法并非旨在設置依賴關系。

所以將依賴項切換成 mock 真的很不自然。

您可以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 可以在這里幫助使被測類成為單例并簡化依賴注入。

如果在您的情況下不可能,Java 5 枚舉至少可以幫助您解決單例問題。


查看完整回答
反對 回復 2022-03-10
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

有許多不同的捷徑可以實現相同的目標(如評論和其他答案中所指出的那樣),但從長遠來看,并非所有這些方法都是好的。

我建議創建一個實現 Decrypt 功能的 Singleton 類。因此,您不必創建多個實例,也不需要使用靜態方法進行解密,并且您可以更輕松地注入您的編解碼器(我假設您沒有多種類型的編解碼器)根據您的評論。但是,如果您這樣做,則應相應地調整功能)。


查看完整回答
反對 回復 2022-03-10
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

根據我在這些情況下的經驗,我只是在 @Before 方法中準備所有實例:


private Codec codec;


@Before

public void setup() throws CodecException {

  codec = new Codec(encryptionType, encryptionKey, false, true, false);

}


查看完整回答
反對 回復 2022-03-10
  • 3 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號