Stubs用于单元测试有什么问题?

我只是看了这个有趣的YouTube视频关于单元测试(这是希特勒用假字幕咀嚼他的团队没有做好单元测试 - 如果你的幽默受到影响就跳过它),其中存根受到严厉的批评。但我不明白存根有什么问题。 我还没有开始使用模拟框架,我还没有开始感觉不使用它的痛苦。 在某个时候,我选择了手写的存根和假货,而不是嘲笑(如Rhinomock等),我是否会为这个世界带来伤害? (使用福勒的分类法) 在模拟和手写存根之间选择有哪些注意事项?     
已邀请:
存根没有任何问题,存在存根,模拟......和间谍的空间。所有都是“测试双打”,但具有不同的目的,如模拟和存根中所解释的不是间谍:   [...]继续前进之前,我想   澄清并定义一些使用中的术语   在这里,我最初发现了   Gerard Meszaros的xUnit模式   书。         虚拟对象是传递给被测系统的占位符对象   但从未使用过。   测试存根为被测系统提供间接输入   Test Spy提供了一种验证被测系统的执行方式   正确的间接输出   模拟对象为被测系统提供间接输入   以及验证间接输出的方法         [...]你可以让这个方便的图表   指导你的决定:      alt text http://www.hamletdarcy.com/files/2007/MocksAreNotSpies.jpg PS:Mockito - 块上的新模拟框架也值得一读。     
我使用以下术语(由单元测试艺术作者Roy Osherove介绍): 假如使用这样的参数调用方法,假如伪造某些东西,伪称为存根。但是如果你也确认这样的呼叫确实发生了或者恰好发生了N次,那么这种假叫被称为模拟。简而言之。假的是一个存根,除非你在它上面调用Verify()然后它是一个模拟。 显然,在某些情况下你需要使用存根,而在其他情况下需要使用模拟。因此,全面批评存根可能是错误的,并且仅使用存根也可能是错误的。 如果您还没有开始使用模拟框架(替代术语:隔离框架),您应该密切关注它们并经常重新评估您的选项。我很快就从手动模拟到NMock2到Moq。这是一个有趣的程序员调查,显示他们使用的内容。手动模拟/存根属于少数,但并不罕见。     
模拟只是更容易投入。它们是你的类的真实实例,预先存在能够用最少的样板覆盖任何方法的动作。 有许多小的考虑因素,例如:如果你不想处理任何方法,你可以让它作为无操作或测试失败 - 你的选择 - 但无论哪种方式几乎没有代码。 当你找到一个班级时,你会获得多少样板?如果你的课程是最终的,你如何处理它?你是先玩耍技巧让你的存根首先在类路径上,还是使用不同的来源? 我建议从嘲笑开始 - 它更容易到处都是。     
使用存根而不是模拟没有任何问题。 如果你想获得技术,模拟是“智能”对象,具有可以验证的期望。存根是返回预设值的虚拟对象。见Mocks Are Not Stubs。 但是许多人(包括我自己)更喜欢使用存根进行状态测试而不是使用模拟进行行为测试。您将一个存根注入到被测试的类中,您调用一个方法,然后检查被测试类的状态。它倾向于进行较少的脆弱测试而不是断言类的内部调用带有参数Y的模拟对象的方法X. 我不认为你是一个受伤的世界。如果您还没有开始感受到疼痛,那么您可能还不需要隔离/模拟框架。如果你这样做,手写的存根/假货不会伤害任何东西。 如果你有很多接口,或者你的接口有很多方法,那么隔离/模拟框架可以节省大量手工编码存根的时间。 我很喜欢Moq;我发现使用它比Rhino Mocks更容易创建存根。     
模拟和存根用于实现真正的单元测试。您只需模拟所有依赖项,并单独测试您的类。 我目前正在使用MOQ进行模拟和存根。     

要回复问题请先登录注册