我建議重構它。
我所看到的信息表明,測試 私有方法的願望可能是代碼異味。有人建議 它可能是一個跡象,這應該被重構到一個單獨的類 並公開。
你已經在自己的問題中涵蓋了各種各樣的原因並反對它,你似乎很清楚這些論點。但是你有一個看起來相當複雜並涉及外部API的方法。 這是值得自行測試的。removeInvalidOperations()
仍然可以是它所在類的私有方法,但它基本上會委託給另一個依賴項。
class YourClass
{
private OperationRemover remover;
public void addKeywords() {
// whatever
removeInvalidOperations();
}
private void removeInvalidOperations() {
remover.remove();
}
}
這給你能在某個時候取代這種依賴關係,包括能夠測試addKeywords()
方法,無需真正將外部API調用,這會使得測試這種方法更容易的好處。例如,OperationRemover
可能是一個接口,並且出於測試目的,您只需傳遞一個存根而不是生產中使用的具體版本。至於你的具體版本,你可以爲它編寫測試,而不依賴於你現有類的情況。
我真的不明白爲什麼我有我當前的代碼設計, 一個問題,但同樣不喜歡編輯我的生產代碼,以適應我的 測試需求的想法。
易測試性是一個副作用。從另一個角度來看:你實際做的是讓代碼鬆耦合和可擴展。上面,我們已經將調用從可能需要使用結果的代碼中分離出來。外部API可能會改變。您可能會從一個服務轉到另一個服務,但使用結果的代碼不必在意。該類可以保持不變,只有實際放置調用的類需要被修改(或替換)。
現實世界的例子:今年是2007年,你在美國一家大型金融中心的銀行工作。您的應用程序需要使用帳戶信息。您的代碼可以在銀行內部的某種Web服務中獲得所需的信息,並以其所需的形式進行處理。 2008年,美國金融業陷入崩潰,而你的銀行(即將瀕臨崩潰)被另一家銀行吞併。您的應用程序不會受到影響,除非您現在必須與尚存銀行內已存在的其他API取得帳戶信息。消費此帳戶信息的代碼是否需要更改?不必要。這是與以前相同的帳戶信息,只是來自不同的來源。不,所有需要更改的是調用API的實現。消費代碼永遠不需要知道。
事實上,這種鬆散的耦合也促進和促進測試是一種獎勵。
我經常使用的一個快速解決方法是將訪問權限從private改爲默認(package),並且僅對單元測試的package package access進行評論。這是否可接受取決於您的編碼標準以及您信任的程度你的同行程序員要明白,即使包訪問,這種方法也不是「真正的API」。 – user949300