有很多关于存根与模拟的文章,但我看不出虚假和存根之间的真正区别。任何人都可以对它有所了解吗?
答案 0 :(得分:30)
我假设您指的是Meszaros引入的术语。 Martin Fowler也定期mentions them。我认为他在那篇文章中很好地解释了这个区别。
尽管如此,我会用自己的话再试一次:)
虚假更接近现实世界的实施而不是存根。存根基本上包含对预期请求的硬编码响应;它们通常用于单元测试,但除了预编程之外,它们无法处理输入。
假货有一个更真实的实现,比如可以保留的某种状态。它们可用于系统测试以及单元测试目的,但由于某些限制或质量要求,它们不适用于生产用途。
答案 1 :(得分:18)
假与其替换的内容具有相同的行为。
存根有一个"固定"一套"罐头"特定于您的测试的回复。
模拟对所做的调用有一系列期望。如果不满足这些期望,则测试失败。
所有这些都是类似的,因为它们取代了在测试中使用的代码的生产协作者。
答案 2 :(得分:5)
这些可能会有所帮助
答案 3 :(得分:1)
用Roy Osherove的书《单元测试的艺术》(第二版)来解释:
假是模仿其他对象的任何对象。伪造品可以作为存根或模拟物使用。
存根是一种伪造品,提供给您正在测试的类以满足其要求,但是在单元测试中将被忽略。
模拟是提供给您正在测试的类的伪造品,和将作为单元测试的一部分进行检查以验证功能。
例如,您正在测试的MyClass
类可能同时使用本地记录器和第三方Web服务作为其操作的一部分。您将创建一个FakeLogger
和一个FakeWebService
,但是它们的使用方式决定了它们是存根还是模拟。
FakeLogger
可以用作 stub :它提供给MyClass
,并假装是记录器,但实际上忽略了所有输入,否则就在那里使MyClass
正常运行。您实际上并没有在单元测试中检查FakeLogger
,就您所担心的,它可以关闭编译器。
FakeWebService
可能用作模拟:您将其提供给MyClass
,在您的一个单元测试中,您会调用MyClass.Foo()
调用第三方Web服务。为了验证是否发生了这种情况,您现在检查FakeWebService
来查看它是否记录了应该接听的电话。
请注意,这两种方法中的任何一种都可以颠倒,并取决于您在特定单元测试中所测试的内容。如果您的单元测试正在测试要记录的内容,那么您可以制作一个FakeLogger
来忠实地记录所告诉的所有内容,以便您可以在单元测试期间进行询问。现在这是一个模拟。在同一测试中,您可能不关心何时调用第三方Web服务。您的FakeWebService
现在是存根。因此,如何填充伪造品的功能取决于是否需要将其用作存根或模拟或同时使用两者。
摘要(从书中直接引用):
fake 是一个通用术语,可用于描述存根或模拟对象,因为它们看起来都像真实对象。 。 。 。基本区别是存根不能通过测试。可以的。
其余所有都是实现细节。