[英]Junit test for private method
我讀了一個問題: 如何測試具有私有方法,字段或內部類的類? 看起來我可能有代碼味道,但是我的代碼實際上很容易重構。 我創建的設計有什么問題。 我創建了一個委托類來處理一些動作,它具有三種方法execute(Action);
PopulateActionHandlers()
和executeActionhandlers();
我的課如下:
public class DelegateHandler{
Map<Integer,ActionHandlers> handlerMaps;
public execute(Action action){
populateActionHandlers(action);
executeActionHandlers();
}//end of execute
//This method can create and populate more than one handlers in handlerMap
private populateActionHandlers(action){
handlerMap = new LinkedHashMap<ActionHandlers>();
if (action.isMultimode()){
handlerMap.add(1,new handler(action.getabc()));
handlerMap.add(2,new handler(action.getabc()-1));
}else{
handlerMap.add(1,new handler(action));
}
}//end of populateActionHandlers
//This method can execute more than one handlers in handlerMap
private executeActionHandlers(){
for(ActionHandler actionHandler : handlerMap.values){
actionHandler.executeAction();
}
}//end of executeActionHandlers
}
現在,我想用JUnit測試populateActionHandlers()
方法,因為沒有必要在類之外公開它,所以將其設為私有。 如果我測試execute()
方法,那么它將同時測試兩個單元的populateActionHandlers()
和executeActionHandlers()
方法,因此我想分別測試它們。 設計(我認為)對我來說似乎還不錯,並且不允許出現任何問題,但是我要么更改對方法的訪問權限(並且僅出於測試目的,但我認為這樣做並不合理,對嗎?)或使用反射(這是一個好主意,以某種方式感覺不對,人們通常使用反射進行junit測試嗎?)。 因此,唯一不能排除的是代碼異味。 但是可能是我的代碼竇並沒有真正幫助我,所以我想了解我是否可以改進此代碼。
不測試私有方法的建議不應通過遺漏私有方法來防止進行怪異的設計,而應強制僅測試具有清晰語義的方法。
私有方法通常是技術助手。 如果底層數據結構發生更改,它們的語義可能會更改,如果調用公共方法使用另一種算法來實現相同的目標,它們甚至可以被優化。
我將以以下方式重寫程序:
...
public execute(Action action){
Map<Integer,ActionHandlers> handlerMap = populateActionHandlers(action);
executeActionHandlers(handlerMap);
}
...
將一個函數的結果存儲到私有字段中,以僅從另一個函數中的該字段中檢索它不是線程安全的,並且很難維護。
但是,由於接口已更改,因此此重構將破壞所有確實測試了示例私有方法的測試(尚未編寫)。 如果您僅測試了公共方法,則此重構后所有測試均有效。
我知道很少可以測試私有方法。 盡管通常可以避免測試私有方法,但我認為檢查私有狀態有時比僅檢查對象的公共狀態更好。 這樣的檢查可能不那么健壯(原因如上所述),但是公共狀態往往不完整且難以主張。 在這兩種情況下,我都使用框架Picklock ,使用戶可以方便地訪問私有方法和字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.