什么是对象嘲笑,我什么时候需要它?

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

0
额外 作者 Michael Freidgeim,

8 答案

对象模仿是一种用虚拟方法从接口,抽象类或类创建“虚拟”或模拟对象的方法。它允许您在自己的定义中打包其中一个用于测试目的。对于您正在测试的某个代码块所依赖的对象是非常有用的。

我喜欢使用的一种流行的称为 Moq ,但还有许多其他类似RhinoMock和许多我不知道的。

0
额外

一个模拟对象可以让你测试你正在编写的内容,以及诸如访问资源(磁盘,网络服务等)的抽象细节。然后模拟让你假装成为外部资源,或者类或其他。

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

如果嘲笑有帮助,什么时候没有嘲笑,练习会显示。

编辑:嘲笑资源特别重要,因此您不必在测试过程中依赖它们,您可以嘲笑它们的存在方式和响应方式的细节(如模拟FileNotFoundException或缺少的web服务,或者web服务的各种可能的返回值)......所有这些都没有涉及缓慢的访问时间(嘲笑将比在测试中访问这样的资源快得多)。

0
额外

另一个用途是它可以让你测试系统中尚未构建的其他部分。例如,如果你的类依赖于别人正在处理的功能中的其他类,那么你可以要求一个基本完整的界面,编程到界面,并且只是模拟你希望它们工作的细节。然后,确保您对界面的假设是正确的(无论是在开发过程中,还是在功能完成时)。

0
额外

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

当然不是。有时候,用手写嘲笑可能会很乏味。但对于简单的事情来说,这并不糟糕。应用最后责任时刻的原则来嘲弄框架,您只能从手当你向自己证明手写模拟比其价值更麻烦时,将其写入框架。

如果你刚刚开始嘲笑,直接跳入框架将至少使你的学习曲线增加一倍(你能否将曲线翻倍?)。当你花费几个项目手动编写模拟时,模拟框架将使得 更有意义。

0
额外

对象模仿用于保持你的单元测试的依赖。 有时你会有一个像“SelectPerson”一样的测试,它将从数据库中选择一个人并返回一个Person对象。

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

0
额外
当对象本身可以被设置并传递回单元测试时,是否有必要模拟一个对象?在那种情况下,这是可取的,为什么?在我的情况下,我有一个使用DTO对象的域图层函数。现在看来,使用Mockito实际编写代码,而不是在DTO对象中使用.set操作,并在单元测试中使用它。示例 - mockObject.setMessage(“Hello”)v / s Mockito.when(mockDTO.getMessage())。然后返回(“Hello”); 10/10次我想去第一种方法。
额外 作者 Ashwin,

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

  1. Performance

    Because unit tests should be fast, testing a component that interacts with a network, a database, or other time-intensive resource does not need to pay the penalty if it's done using mock objects. The savings add up quickly.

  2. Collaboration

    If you are writing a nicely encapsulated piece of code that needs to interact with someone else's code (that hasn't been written yet, or is in being developed in parallel - a common scenario), you can exercise your code with mock objects once an interface has been agreed upon. Otherwise your code may not begin to be tested until the other component is finished.

0
额外

它可以让你测试你的项目的一个部分如何与其余部分相互作用,而不是构建整个事物并可能缺少重要部分。

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

0
额外

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

0
额外