代码之家  ›  专栏  ›  技术社区  ›  Mike Minutillo

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

  •  42
  • Mike Minutillo  · 技术社区  · 18 年前

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

    9 回复  |  直到 13 年前
        1
  •  35
  •   jscs    13 年前

    对象模拟用于防止依赖项进入单元测试。 有时,您会有一个类似“select person”的测试,它将从数据库中选择一个人并返回一个person对象。

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

        2
  •  17
  •   Tiago Almeida Pete W    13 年前

    有几个人已经回答了“什么”,但这里有几个快速的“为什么”,我可以想到:

    1. 性能

      因为单元测试应该很快,所以测试一个 与网络、数据库或其他时间密集型交互 如果资源使用mock完成,则不需要支付罚金。 物体。储蓄加起来很快。

    2. 协作

      如果你正在写一个很好地封装的 需要与其他人的代码交互的代码(没有 已经被写了,或者正在被并行开发-一个共同点 场景),您可以使用模拟对象一次 接口已达成一致。否则,您的代码可能不会开始 测试直到另一个部件完成。

        3
  •  12
  •   Mike Stone    18 年前

    模拟对象允许您根据所写内容和抽象细节(如访问资源(磁盘、网络服务等)进行测试。然后,这个模拟允许您假装是外部资源、类或其他什么东西。

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

    练习将显示何时模拟有用,何时不有用。

    编辑:模拟资源特别重要,因此您不必依赖它们在测试期间存在,您可以模拟它们存在的方式和响应的详细信息(例如模拟fileNotFoundException或缺少的WebService,或WebService的各种可能返回值)。所有这些都没有涉及到缓慢的访问时间(模拟将证明比在测试中访问此类资源快得多)。

        4
  •  9
  •   Brad Tutterow    18 年前

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

    当然不是。有时候,用手写笑话会很乏味。但对于简单的事情,这一点也不坏。应用 Last Responsible Moment 对于模拟框架,只有当您向自己证明手写模拟比它的价值更麻烦时,才应该从手写模拟转换为框架。

    如果你只是从模仿开始,直接跳到一个框架中至少会使你的学习曲线翻倍(你能把曲线翻倍吗?).模拟框架将 许多的 当你花了几个项目用手写模型的时候,你会感觉更好。

        5
  •  6
  •   Nick Berardi    18 年前

    对象模拟是一种从接口、抽象类或使用虚拟方法的类创建“虚拟”或模拟对象的方法。为了测试的目的,它允许您在自己的定义中包装其中的一个。它对于生成一个依赖于您正在测试的某个代码块的对象很有用。

    我喜欢用的一种流行的叫做 Moq 但是还有很多其他的,像犀牛,还有很多我不知道的。

        6
  •  5
  •   Ed.    18 年前

    它允许您测试项目的一个部分如何与其他部分交互,而不构建整个项目,也不可能缺少重要的部分。

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

        7
  •  3
  •   Mike Stone    18 年前

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

        8
  •  1
  •   Curt Hagenlocher    18 年前

    模拟框架是否有用在一定程度上取决于所编写代码的语言。对于静态语言,您需要付出额外的努力,以欺骗编译器接受您的模拟对象作为对真实事物的替换。在动态类型语言(如python、ruby或javascript)中,通常只需将方法附加到任意对象或类上,并将其作为参数传递,这样框架的附加值就会少得多。

        9
  •  0
  •   TDD    17 年前

    2.NET单元测试的推荐模拟框架是typemock-isolator和rohino-mock。

    在下面的链接中,您可以看到typemock中关于为什么需要 mocking framework 用于单元测试。