我刚刚看了这个搞笑的 关于单元测试的 YouTube 视频 (希特勒用假字幕批评他的团队没有做好单元测试——如果你幽默感受损,请跳过它)存根受到了严厉的批评。但我不明白存根有什么问题。

我还没有开始使用模拟框架,也没有开始感受到不使用模拟框架带来的痛苦。

我是否会在未来的某个时刻受到世界的伤害? 选择了手写存根和赝品而不是模拟(如 Rhinomock 等)? (使用福勒的分类法)

在模拟存根和手写存根之间进行选择时需要考虑哪些因素?

有帮助吗?

解决方案

存根没有任何问题,有存根、模拟的空间......和间谍。全部都是“测试替身”,但具有不同的目的,如中所述 模拟和存根不是间谍:

...]在继续前进之前,我想澄清并定义这里使用的一些术语,我最初在Gerard Meszaros中发现了一些术语' Xunit模式书.

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

...]您可以让此方便的图表指导您的决定:

alt text

附: Mockito - 最新的模拟框架 也值得一读。

其他提示

我使用下面的术语(由Roy Osherove,单元测试的技术的作者引入):

A 的被称为的存根的,如果你告诉它假在什么情况下,方法被调用,这样那样的参数。但是,如果你还证实该呼叫实际发生或发生的确切N次,那么这样的假称为的模拟的。简而言之。假是一个短截线,除非你打电话验证()就可以了,然后它是一个模拟。

显然,你将需要使用在某些情况下存根和嘲笑别人。因此,全面批判存根可能是错误的,并使用专门的存根可能是错误的为好。

如果你还没有使用模拟框架开始(替代项:隔离框架的),你应该保持对他们的眼睛,并经常重新评估你的选择。我从手动嘲笑去NMock2以起订量非常快。这里有一个有趣的程序员的调查可以表明,他们使用什么。手动嘲笑/存根是少数的,但都不是少见。

嘲弄只是一个更容易扔在。他们是你的类的实例实,预存根与覆盖以最小的样板任何方法的动作的能力。

有许多小的考虑,例如:如果你不想处理任何的方法,你可以把它作为一个无操作或在测试不及格 - 你的选择 - 但无论哪种方式几乎没有任何代码。

多少样板,当你踩灭了一类,你得到什么?你是如何处理它,如果你的类是final?你玩的技巧,首先让你的类路径上的存根,或者你使用不同的源?

我建议刚开始使用的嘲笑 - 这是比较容易各地

有什么错误使用,而不是嘲笑存根。

如果你想获得的技术,嘲笑与经查证属实的期望“智能”的对象。存根是返回预设值虚拟对象。请参阅模拟的功能不存根

但很多人(包括我自己)喜欢做与存根状态的测试,而不是行为测试与嘲笑。可以注入的存根被测类,你调用一个方法,那么你检查被测类的状态。它往往使对脆性较低的测试比断言类的内部调用自变量Y上的模拟对象的方法X

我不认为你伤害的世界就能加入。如果你还没有开始感觉疼痛,你可能不需要隔离/嘲讽框架呢。当如果你这样做,有手写的存根/假货周围是不会伤害任何东西。

如果你有很多的接口,或者如果你的接口有很多的方法,隔离/嘲讽框架可以节省大量的时间在手工编码的存根。

我喜欢 Moq的很多;我觉得它更容易比犀牛制品用于创建存根。

和嘲笑存根用于实现真正的单元测试。你刚才嘲笑所有的依赖,以及单元测试中隔离类。

我目前使用 MOQ 获得嘲笑和存根。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top