什么是对象模拟,什么时候需要它?

Mik*_*llo 43 testing mocking

许多人在编写单元测试时都使用模拟对象.什么是模拟对象?我为什么需要一个?我需要一个模拟对象框架吗?

lom*_*axx 35

对象模拟用于保持单元测试之外的依赖关系.有时你会有像"SelectPerson"这样的测试,它会从数据库中选择一个人并返回一个Person对象.

为此,您通常需要依赖于数据库,但是使用对象模拟可以使用模拟框架模拟与数据库的交互,因此它可能返回一个看起来像从数据库返回的数据集,然后您可以测试您的代码,以确保它处理将数据集转换为person对象,而不是使用它来测试是否存在与数据库的连接.


Jos*_*non 17

有几个人已经回答了"什么",但这里有几个我能想到的快速'为什么':

  1. 性能

    因为单元测试应该很快,所以测试与网络,数据库或其他时间密集型资源交互的组件如果使用模拟对象完成则不需要支付罚金.节省的成本很快.

  2. 合作

    如果你正在编写一个很好的封装代码片段,需要与其他人的代码进行交互(还没有编写,或者是并行开发 - 这是常见的场景),你可以使用模拟对象来执行代码.界面已经达成一致.否则,在完成其他组件之前,您的代码可能无法开始测试.


Mik*_*one 12

模拟对象允许您测试您正在编写的内容,以及抽象的详细信息,例如访问资源(磁盘,网络服务等).模拟然后让你假装是外部资源,或类或其他什么.

你真的不需要一个模拟对象框架,只需在测试中扩展你不想担心的功能类,并确保你正在测试的类可以使用你的模拟而不是真实的东西(传递给它)通过构造函数或setter或其他东西.

实践将显示嘲笑是有帮助的,何时不是.

编辑:模拟资源尤其重要,因此您不必在测试期间依赖它们,并且您可以模拟它们如何存在以及它们响应的详细信息(例如模拟FileNotFoundException或缺少的Web服务) ,或者webservice的各种可能的返回值)......所有这些都没有涉及缓慢的访问时间(模拟将比在测试中访问这些资源更快).


Bra*_*row 9

我需要一个模拟对象框架吗?

当然不是.有时候,手工编写模拟可能会非常繁琐.但对于简单的事情,它一点都不差.将Last Responsible Moment的原则应用于模拟框架,只有当你向自己证明手工编写模拟比它的价值更麻烦时,你应该只从手写的模拟切换到框架.

如果你刚刚开始嘲笑,那么直接进入框架将至少使你的学习曲线加倍(你可以加倍曲线吗?).嘲讽框架将使很多更有意义,当你花了几个项目,手写嘲笑.


Nic*_*rdi 6

Object Mocking是一种使用虚方法从接口,抽象类或类创建"虚拟"或模拟对象的方法.它允许您在自己的定义中对其中一个进行排序以进行测试.它对于为您正在测试的某个代码块创建一个依赖的对象很有用.

我喜欢使用的一种流行的叫做Moq,但还有许多其他像RhinoMock和我不知道的很多.


Ed.*_*Ed. 5

它允许您测试项目的一部分如何与其余部分交互,而不构建整个事物并可能缺少重要部分.

编辑:来自维基百科的很好的例子:它允许您事先测试代码,就像汽车设计师使用碰撞测试假人来测试事故期间汽车的行为.