许多人在编写单元测试时都使用模拟对象。什么是模拟对象?我为什么需要一个?我需要一个模拟对象框架吗?
答案 0 :(得分:35)
对象模拟用于保持单元测试之外的依赖关系。 有时你会有像“SelectPerson”这样的测试,它会从数据库中选择一个人并返回一个Person对象。
为此,您通常需要依赖数据库,但是使用对象模拟可以使用模拟框架模拟与数据库的交互,因此它可能会返回一个数据集,该数据集看起来像是从数据库返回的数据集而您然后可以测试您的代码以确保它处理将数据集转换为person对象,而不是使用它来测试是否存在与数据库的连接。
答案 1 :(得分:17)
有几个人已经回答了'什么',但这里有几个我能想到的快速'为什么':
<强>性能强>
因为单元测试应该很快,所以测试一个组件 与网络,数据库或其他时间密集型交互 如果使用mock完成,资源不需要支付罚款 对象。节省的费用很快就会增加。
<强>协作强>
如果你正在写一个很好的封装的 需要与其他人的代码交互的代码(没有 已写入,或正在并行开发 - 一个常见的 方案),你可以用模拟对象练习你的代码 界面已经达成一致。否则您的代码可能无法开始 在其他组件完成之前进行测试。
答案 2 :(得分:12)
模拟对象允许您测试您正在编写的内容,以及抽象的详细信息,例如访问资源(磁盘,网络服务等)。模拟然后让你假装是外部资源,或类或其他。
你真的不需要一个模拟对象框架,只需在测试中扩展你不想担心的功能类,并确保你测试的类可以使用你的模拟而不是真实的东西(通过构造函数或setter或其他东西传递它。
练习将显示嘲笑是否有用以及什么时候没有。
编辑:模拟资源尤为重要,因此您不必在测试期间依赖它们,并且可以模拟它们如何存在以及它们响应的详细信息(例如模拟FileNotFoundException或Web服务)缺少的,或Web服务的各种可能的返回值)...所有没有涉及的访问时间慢(模拟将比在测试中访问这些资源更快)。答案 3 :(得分:9)
我是否需要模拟对象框架?
当然不是。有时候,手工编写模拟可能会非常繁琐。但对于简单的事情,它一点都不差。将Last Responsible Moment的原则应用于模拟框架,只有当你向自己证明手工编写模拟比它的价值更麻烦时,你才应该从手写的模拟切换到框架。
如果你刚刚开始嘲笑,直接进入框架将至少使你的学习曲线加倍(你可以加倍曲线吗?)。当您花费一些项目手工编写模拟时,模拟框架会使更多更有意义。
答案 4 :(得分:6)
Object Mocking是一种使用虚方法从接口,抽象类或类创建“虚拟”或模拟对象的方法。它允许您在自己的定义中对其中一个进行排序以进行测试。它对于为您正在测试的某个代码块创建一个依赖的对象非常有用。
我喜欢使用的一种流行的叫Moq,但还有许多其他像RhinoMock和我不知道的很多。
答案 5 :(得分:5)
它允许您测试项目的一部分如何与其余部分交互,而不构建整个事物并可能遗漏一个重要部分。
编辑:维基百科的优秀示例:它允许您事先测试代码,就像汽车设计师使用碰撞测试假人来测试事故期间汽车的行为一样。答案 6 :(得分:3)
另一个用途是它可以让您测试系统中尚未构建的其他部分。例如,如果您的类依赖于某个其他人正在处理的功能的其他类,您可以只需要一个基本完整的界面,编程到界面,并按照您希望的方式模拟细节。然后,确保您对界面的假设是正确的(无论是在开发时还是在完成功能之后)。
答案 7 :(得分:1)
你是否有一个模拟框架是有用的,部分取决于你正在编写的代码的语言。使用静态语言,您需要付出额外的努力才能欺骗编译器接受您的模拟对象作为真实事物的替代品。在动态类型语言(如Python,Ruby或Javascript)中,通常只需将方法附加到任意对象或类上,并将其作为参数传递 - 因此框架将增加更少的值。
答案 8 :(得分:0)
.net单元测试的2个推荐模拟框架是Typemock Isolator和Rhino Mock。
在以下链接中,您可以看到Typemock的解释,说明为什么需要mocking framework进行单元测试。