模拟和存根之间有什么区别?

我读过各种关于嘲笑与测试中残段的文章,包括Martin Fowler的Mocks Are Stubs,但仍不明白其中的差别。


存根

我相信最大的区别是你已经用预定的行为写了一个存根。 所以你会有一个类来实现你为了测试目的而伪装的依赖关系(抽象类或接口),而这些方法只会被设置为响应。 他们不会做任何事情,而且你已经在测试之外编写了它的代码。

嘲笑

模拟是你测试的一部分,你必须设置你的期望。 模拟不是以预定的方式设置的,所以你有代码在你的测试中完成。 嘲笑是在运行时确定的,因为设置预期的代码在执行任何操作之前必须运行。

区别

使用mock编写的测试通常遵循initialize -> set expectations -> exercise -> verify模式进行测试。 虽然预先写好的存根会遵循initialize -> exercise -> verify

相似

两者的目的是消除测试类或函数的所有依赖关系,以便让您的测试更加关注并简化他们试图证明的内容。


前言

有几个对象的定义,并不是真实的。 总称是测试双 。 这个术语包含: 虚拟的假的存根模拟

参考

根据马丁福勒的文章:

  • 虚拟对象被传递但从未实际使用过。 通常它们只是用来填充参数列表。
  • 假的对象实际上有工作的实现,但通常会采取一些快捷方式,使它们不适合生产(内存数据库就是一个很好的例子)。
  • 存根提供了在测试过程中进行的调用的解答,通常对测试之外的任何事情都没有响应。 存根还可以记录关于呼叫的信息,例如记录其“发送”消息的电子邮件网关存根,或者可能仅记录“发送”的消息数量。
  • 嘲笑是我们在这里讨论的内容:预先编制了预期的对象,这些预期形成了预期要接收的呼叫的规范。
  • 样式

    Mocks vs Stubs =行为测试与状态测试

    原理

    根据每个测试只测试一件事的原则,在一次测试中可能有几个存根,但通常只有一个模拟。

    生命周期

    测试与存根的生命周期:

  • 设置 - 准备正在测试的对象及其存根协作者。
  • 练习 - 测试功能。
  • 验证状态 - 使用断言来检查对象的状态。
  • 拆解 - 清理资源。
  • 使用mocks测试生命周期:

  • 设置数据 - 准备正在测试的对象。
  • 设置期望 - 准备主对象正在使用的模拟期望。
  • 练习 - 测试功能。
  • 验证期望 - 验证在模拟中调用了正确的方法。
  • 验证状态 - 使用断言来检查对象的状态。
  • 拆解 - 清理资源。
  • 概要

    模拟和存根测试都给出了这个问题的答案: 结果是什么?

    模拟测试也感兴趣: 结果如何实现?


    存根是简单的假物体。 它只是确保测试顺利进行。
    模拟是更聪明的存根。 您验证您的测试通过它。

    链接地址: http://www.djcxy.com/p/27917.html

    上一篇: What's the difference between a mock & stub?

    下一篇: looser throw specifier for in C++