![](/img/trans.png)
[英]How to Mock an object which is created in the class under test in 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不模擬私有方法的原因有兩個:
- 它需要對類加載器進行黑客攻擊,而這種加載器決不能證明其安全性,並且會更改API(您必須使用自定義測試運行器,對類進行注釋等)。
- 這很容易解決 - 只需將方法的可見性從私有更改為受包保護(或受保護)。
- 它要求團隊花時間實施和維護它。 鑒於第(2)點以及已經在不同工具(powermock)中實現的事實,它沒有意義。
- 最后...模擬私有方法暗示着面向對象的理解存在問題。 在OO中,您希望對象(或角色)進行協作,而不是方法。 忘記Pascal和程序代碼。 在對象中思考。
如果您真的想模擬私有方法,請查看PowerMock 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.