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

时间:2009-10-05 23:02:53

标签: unit-testing mocking rhino-mocks stubs

我只是看着这个有趣的YouTube Video about unit testing(这是希特勒用假字幕咀嚼他的团队没有做好单位测试 - 如果你的幽默受到影响就跳过它),那里的存根受到严厉的批评。但我不明白存根有什么问题。

我还没有开始使用模拟框架,我还没有开始感觉不使用它的痛苦。

我在某个时候为了一个世界受到伤害,having chosen handwritten stubs and fakes instead of mocks (like Rhinomock etc)?(使用福勒的分类法)

在模拟和手写存根之间选择有哪些注意事项?

5 个答案:

答案 0 :(得分:11)

存根没有任何问题,存在存根,嘲笑......和间谍的空间。所有都是“测试双打”,但具有不同目的,如Mocks and Stubs aren't Spies中所述:

  

[...]继续前进之前,我想   澄清并定义一些使用中的术语   在这里,我最初发现的   Gerard Meszaros'xUnit Patterns book

     
      
  • 虚拟对象是传递给被测系统的占位符对象   但从未使用过。
  •   
  • 测试存根为被测系统提供间接输入
  •   
  • Test Spy提供了一种验证被测系统的执行方式   正确的间接输出
  •   
  • Mock对象为被测系统提供间接输入   以及验证间接输出的方法
  •   
     

[...]你可以让这个方便的图表   指导你的决定:

     

alt text

PS:Mockito - The New Mock Framework on the Block值得一读。

答案 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进行模拟和存根。