什么是“存根”?

所以,继续我的新年决心,让更多的TDD,我现在开始更多地与Rhino Mocks合作 。

我所热衷的一件事是确保我真正理解我正在接触的内容,所以我想检查一下我对目前为止所看到的内容的理解(我认为将它作为一个资源)。

什么是“存根”?

马丁·福勒(Martin Fowler)就这个问题写了一篇很棒 从那篇文章:

Meszaros使用术语“testing双重”(Test Double)作为用于testing目的的任何types假装对象的通用术语。 这个名字来源于电影“特技双雄”的概念。 (他的目标之一是避免使用任何已经被广泛使用的名字).Meszaros然后定义了四种特殊types的double:

  • 虚拟对象被传递但从未实际使用。 通常他们只是用来填充参数列表。
  • 虚假的对象实际上有工作的实现,但通常采取一些捷径,使他们不适合生产(内存数据库是一个很好的例子)。
  • 存根提供了在testing过程中进行调用的jar装答案,通常对testing以外的任何事情都没有响应。 存根还可以logging关于呼叫的信息,例如logging其“发送”消息的电子邮件网关存根,或者可能仅logging“发送”的消息的数量。
  • 嘲笑是我们在这里谈论的东西:预先编程有预期的对象,这些预期构成了预期接收的呼叫的规格。

用我自己的话来说:模拟对象“期待”某些方法被调用,通常会导致unit testing失败,如果他们的期望不符合。 存根(Stub)对象提供了预设的响应(可以由辅助库自动生成),但通常不会直接导致unit testing失败。 通常只使用它们,以便testing的对象获取所需的数据以完成其工作。

“存根(stub)”是为了提供数据/某种响应而存在的接口的实现。 例如:

  • 一个DataSet
  • 用户列表
  • 一个Xml文件

通常情况下,这将由另一个服务(无论是Web服务,另一个应用程序,数据库)提供,但为了提高代码的可testing性 ,结果是“假的”。

这样做的主要好处是可以根据预期的数据在unit testing中进行断言。 如果由于数据错误而出现错误,则可以轻松地添加testing,创build新的存根(复制数据错误)和生成的代码以纠正错误。

存根不同于模拟 ,它们用于表示和testing对象的状态 ,而模拟testing它的相互作用

我相信“存根”来自STartUpBlock。 它是用来引用自动生成的代码的一部分,以帮助您,开发人员,开始。