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

有帮助吗?

解决方案

对象模拟用于将依赖项排除在单元测试之外。有时您会进行像“SelectPerson”这样的测试,它将从数据库中选择一个人并返回一个 Person 对象。

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

其他提示

有几个人已经回答了“什么”,但以下是我能想到的几个简单的“原因”:

  1. 表现

    因为单位测试应该快速,所以测试与网络,数据库或其他耗时资源交互的组件,如果使用模拟对象完成罚款,则不需要支付罚款。节省下来的钱很快就会增加。

  2. 合作

    如果您正在编写一件封装好的代码,需要与他人的代码进行交互(尚未编写,或者正在并行开发 - 一种常见的情况),则可以使用模拟对象使用模拟对象进行代码界面已达成协议。否则,在其他组件完成之前,您的代码可能不会开始测试。

模拟对象可让您仅测试正在编写的内容以及抽象细节,例如访问资源(磁盘、网络服务等)。然后,模拟可以让您假装是外部资源、类或其他任何东西。

您实际上并不需要模拟对象框架,只需扩展您不想在测试中担心的功能类,并确保您正在测试的类可以使用您的模拟而不是真实的东西(将其传递给通过构造函数或设置器或其他东西。

实践将证明模拟何时有用、何时无用。

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

我需要模拟对象框架吗?

当然不是。有时,手动编写模拟可能非常乏味。但对于简单的事情来说,这还不错。应用原理 最后负责任的时刻 对于模拟框架,只有当您向自己证明手写模拟麻烦大于其价值时,您才应该从手写模拟切换到框架。

如果您刚刚开始进行模拟,那么直接跳入框架将使您的学习曲线至少加倍(您可以加倍曲线吗?)。模拟框架将使 很多 当您花费了一些手工编写模拟的项目时,这会更有意义。

对象模拟是一种从接口、抽象类或具有虚拟方法的类创建“虚拟”或模拟对象的方法。它允许您将其中之一包装在您自己的定义中以进行测试。它对于创建一个您正在测试的特定代码块所依赖的对象非常有用。

我喜欢使用的一种流行的称为 起订量, ,但是还有很多其他的,比如 RhinoMock,还有很多我不知道的。

它允许您测试项目的一部分如何与其余部分交互,而无需构建整个项目并可能丢失重要部分。

编辑:维基百科上的一个很好的例子:它允许您预先测试代码,就像汽车设计师使用碰撞测试假人来测试汽车在事故中的行为一样。

另一个用途是它可以让您测试系统中尚未构建的其他部分。例如,如果您的类依赖于其他类,而该类是其他人正在开发的功能的一部分,那么您可以只要求一个基本完整的接口,对接口进行编程,然后按照您期望的方式模拟细节。然后,确保您对界面的假设是正确的(无论是在开发过程中,还是在功能完成后)。

模拟框架是否有用部分取决于您正在编写的代码的语言。使用静态语言,您需要付出额外的努力来欺骗编译器接受您的模拟对象作为真实对象的替代品。在 Python、Ruby 或 Javascript 等动态类型语言中,您通常可以将方法附加到任意对象或类上,并将其作为参数传递——因此框架增加的价值要少得多。

.net 单元测试的 2 个推荐模拟框架是 Typemock Isolator 和 Rhino Mock。

在下面的链接中,您可以看到 Typemock 的解释,说明为什么您需要 模拟框架 用于单元测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top