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