Unit testing 单元测试的存根有什么问题?

Unit testing 单元测试的存根有什么问题?,unit-testing,mocking,rhino-mocks,stubs,Unit Testing,Mocking,Rhino Mocks,Stubs,我刚刚看了这部有趣的电影(这是希特勒用假字幕责骂他的团队没有做好单元测试——如果你有幽默感,就跳过它),其中存根受到了严厉的批评。但我不明白存根怎么了 我还没有开始使用mocking框架,也没有因为没有使用它而感到痛苦 我是否会在某个时候受到伤害(使用福勒的分类法) 在模拟存根和手写存根之间进行选择的考虑因素是什么?模拟更容易加入。它们是类的真实实例,预先存根,能够用最少的样板覆盖任何方法的操作 这里有很多小的考虑因素,比如:如果你不想处理任何一个方法,你可以让它作为一个不可操作的方法,或者让它

我刚刚看了这部有趣的电影(这是希特勒用假字幕责骂他的团队没有做好单元测试——如果你有幽默感,就跳过它),其中存根受到了严厉的批评。但我不明白存根怎么了

我还没有开始使用mocking框架,也没有因为没有使用它而感到痛苦

我是否会在某个时候受到伤害(使用福勒的分类法)


在模拟存根和手写存根之间进行选择的考虑因素是什么?

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

这里有很多小的考虑因素,比如:如果你不想处理任何一个方法,你可以让它作为一个不可操作的方法,或者让它通过测试——这是你的选择——但不管怎样,实际上都没有代码

当你把一门课删掉时,你会得到多少样本?如果你的课程是期末考试,你怎么处理?您是先在类路径上获取存根,还是使用不同的源代码


我建议从模拟开始——这更简单。

模拟和存根用于实现真正的单元测试。您只需模拟所有依赖项,并单独对类进行单元测试


我目前使用的是模拟和存根。

使用存根代替模拟没有什么错

如果你想获得技术,mock是“智能”对象,它的期望值是可以验证的。存根是返回预设值的虚拟对象。看

但是许多人(包括我自己)更喜欢使用存根进行状态测试,而不是使用mock进行行为测试。将存根注入到被测试的类中,调用方法,然后检查被测试的类的状态。与断言类的内部称为参数为Y的模拟对象的方法X相比,它倾向于进行不那么脆弱的测试

我不认为你会受到伤害。如果您还没有开始感到痛苦,那么您可能还不需要隔离/模拟框架。如果你真的这样做了,在你周围有手写的存根/赝品不会有任何伤害

如果您有很多接口,或者如果您的接口有很多方法,那么隔离/模拟框架可以比手工编写存根节省大量时间


我喜欢很多;我发现创建存根比Rhino Mock更容易使用。

存根没有问题,存根、mock都有空间。。。还有间谍。所有测试均为“测试双精度”,但目的不同,如中所述:

[…]在继续之前,我想 澄清和定义一些使用中的术语 在这里,我最初是在 杰拉德·梅萨罗斯

  • 虚拟对象是传递给测试系统的占位符对象 但从未使用过
  • 测试存根为被测系统提供间接输入
  • 测试间谍提供了一种验证被测系统是否已执行的方法 正确的间接输出
  • 模拟对象为被测系统提供两个间接输入 以及验证间接输出的方法
[…]你可以让这个方便的图表 指导您的决策:


PS:也值得一读。

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

如果您告诉一个伪对象伪造某些东西,以防用这样或那样的参数调用一个方法,那么这个伪对象就称为存根。但是,如果您还验证了这样的调用是否确实发生过或发生了N次,那么这种伪调用称为模拟。简言之假文件是存根,除非对其调用Verify(),然后它是模拟文件

显然,在某些情况下需要使用存根,在其他情况下需要使用mock。因此,全面地批评存根可能是错误的,完全使用存根也可能是错误的


如果您还没有开始使用模拟框架(替代术语:隔离框架),您应该密切关注它们并经常重新评估您的选项。我很快从手动模拟到NMock2再到Moq。下面是一组有趣的程序员,展示了他们使用的东西。手动模拟/存根是少数,但并不少见。

你应该使用模拟框架(我使用rhino)来实现这一点。他们会做很多事情来让你的TDD生活更轻松。图表+0.5,链接-1为图表+0.5,这基本上是错误的。mock在断言时可能会失败,它们更易于维护,并且在各个方面都更易于使用。我认为该图表可能已经过时,或者与旧的模拟框架或旧的Java语言/版本的框架相反。(不是真的投票-1,但该图表不好)+1表示单元测试的艺术(好书)和Moq(好工具)。