我读了这个问题:如何测试具有私有方法、字段或内部类的类?我似乎有一种代码的味道,但我的代码实际上很容易重构。我所做的设计有什么问题。我创建了一个委托类来处理一些操作它有三个方法
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
}
现在我想测试一下 populateActionHandlers()
方法,我将其设置为私有,因为不需要将其暴露在此类之外。如果我测试一下 execute()
方法,然后它将测试两者 populateActionHandlers()
以及 executeActionHandlers()
方法是同时测试两个单元,我想分别测试它们。这个设计(我认为)对我来说似乎很好,不允许出现任何问题,但是我要么改变对方法的访问(而且仅仅是为了测试,我认为它不能证明这一点,对吧?)要么使用反射(这是一个好主意,不知何故它感觉不对,人们通常在junit测试中使用反射吗?)。所以唯一不能排除的就是代码气味。但可能是我的代码窦不是真的帮助我,所以我想了解,如果我可以改善这个代码。
1条答案
按热度按时间goucqfw61#
不测试私有方法的建议不应该阻止人们通过忽略私有方法来进行奇怪的设计,而应该强制只测试具有清晰语义的方法。
私人方法通常是技术帮助者。如果底层数据结构发生变化,它们的语义就会发生变化;如果调用公共方法使用另一种算法来实现相同的目标,它们甚至可以被优化掉。
我会按照以下方式重写程序:
将一个函数的结果存储到一个私有字段中,只是为了从另一个函数的这个字段中检索它,这不是线程安全的,而且更难维护。
然而,这种重构会破坏所有测试您的示例的私有方法的测试(但不是写的),因为接口已经更改了。如果您只测试了public方法,那么在重构之后,所有测试都是有效的。
我知道很少有情况下测试私有方法是可以的。虽然测试私有方法通常是可以避免的,但我认为检查私有状态有时比只检查对象的公共状态更好。这样的检查可能不够有力(原因如上所述),但公共状态往往是不完整的,很难Assert。在这两种情况下,我都使用框架picklock,它使人们能够以方便的方式访问私有方法和字段。