簡體   English   中英

如何在Mockito中模擬正在測試的班級中的私人班級成員

[英]How to mock private class members in a class under test with Mockito

我有一個遺留類,添加了一些方法,並且需要創建一些僅測試這四個方法的JUnit測試。 被測類有一個參數構造函數,用於初始化字符串。 但是,在構造函數中調用一個私有方法,該方法使用屬性文件初始化幾個私有類和一個數據源。 我要測試的方法不使用任何這些類。

我是剛開始編寫JUnit測試的人,不知道如何模擬此私有方法,或者是否有可能。
正在測試的類的構造函數是這樣的:

public ClassUnderTest(String wlUrl) throws Exception {
try {
    this.url = wlUrl;
    initialize();
} catch (Exception ex) {
    throw ex;
}

} initialize()方法是私有的,它實例化了一些我不想在要測試的方法中使用的私有類。

private void initialize() throws Exception {
    try {
        PropertyManager.getInstance();
        logAdapter = LogAdapter.getInstance(PropertyManager.getProperty("LOG_CONFIG_FILE"));    
        log20 = new ServerLogging20();
        ds = (javax.sql.DataSource) ctx.lookup(PropertyManager.getProperty("DATASOURCE"));
        setInitialContext(url);
    } catch (Exception e) {
        log.error("ERROR instantiating PropertyManager & LogAdapter  - " + e.getMessage());
        throw e;
    }
}

有什么方法可以模擬這個私有方法來測試我編寫的方法?

Mockito不支持模擬私有方法。
以下是Mockito常見問題解答的摘錄:

為什么Mockito不模擬私有方法?

首先,我們並不是在嘲笑私有方法。 我們只是不關心私有方法,因為從測試的角度來看,私有方法不存在。 Mockito不模擬私有方法的原因有兩個:

  1. 它需要對類加載器進行黑客攻擊,而這種加載器決不能證明其安全性,並且會更改API(您必須使用自定義測試運行器,對類進行注釋等)。
  2. 這很容易解決 - 只需將方法的可見性從私有更改為受包保護(或受保護)。
  3. 它要求團隊花時間實施和維護它。 鑒於第(2)點以及已經在不同工具(powermock)中實現的事實,它沒有意義。
  4. 最后...模擬私有方法暗示着面向對象的理解存在問題。 在OO中,您希望對象(或角色)進行協作,而不是方法。 忘記Pascal和程序代碼。 在對象中思考。

如果您真的想模擬私有方法,請查看PowerMock

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM