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

Mat*_*tin 14 unit-testing rhino-mocks mocking stubs

我只是看了这个有趣的YouTube视频关于单元测试(这是希特勒用假字幕咀嚼他的团队没有做好单元测试 - 如果你的幽默受到影响就跳过它),其中存根受到严厉的批评.但我不明白存根有什么问题.

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

在某个时候,我选择了手写的存根和假货,而不是嘲笑(如Rhinomock等)?(使用福勒的分类法)

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

Pas*_*ent 12

存根没有任何问题,存在存根,模拟......和间谍的空间.所有都是"测试双打",但具有不同的目的,如模拟和存根中所解释的不是间谍:

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

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

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

alt text http://www.hamletdarcy.com/files/2007/MocksAreNotSpies.jpg

PS:Mockito - 块上的新模拟框架也值得一读.


azh*_*lov 8

我使用以下术语(单元测试艺术作者Roy Osherove介绍):

一个被称为存根,如果你告诉它假在什么情况下,方法被调用,这样那样的参数.但是如果你也确认这样的呼叫确实发生了或者恰好发生了N次,那么这种伪造被称为模拟.简而言之.假的是一个存根,除非你在它上面调用Verify()然后它是一个模拟.

显然,在某些情况下你需要使用存根,而在其他情况下需要使用模拟.因此,全面批评存根可能是错误的,并且仅使用存根也可能是错误的.

如果您还没有开始使用模拟框架(替代术语:隔离框架),您应该密切关注它们并经常重新评估您的选项.我很快就从手动模拟到NMock2到Moq.这是一个有趣的程序员调查,显示他们使用的内容.手动模拟/存根属于少数,但并不常见.


Bil*_*l K 5

模拟更容易投入.它们是类的真实实例,预先存在能够用最少的样板覆盖任何方法的操作的能力.

有许多小的考虑因素,例如:如果你不想处理任何方法,你可以让它充当无操作或测试失败 - 你的选择 - 但无论哪种方式几乎没有代码.

你在课堂上留下了多少样板?如果你的课程是最终的,你如何处理它?你是先玩弄技巧让你的存根首先在类路径上,还是使用不同的来源?

我建议从嘲笑开始 - 它更容易到处都是.