【问题标题】:What is Object Mocking and when do I need it?什么是对象模拟,我什么时候需要它?
【发布时间】:2019-08-20 05:56:27
【问题描述】:

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

【问题讨论】:

标签: testing mocking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我喜欢使用的一个流行的叫Moq,但还有很多其他的,比如RhinoMock,还有很多我不知道的。

    【讨论】:

      【解决方案3】:

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

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

      练习会显示模拟什么时候有用,什么时候没用。

      编辑:模拟资源特别重要,因此您不必依赖它们在测试期间存在,并且您可以模拟它们如何存在以及它们响应的细节(例如模拟 FileNotFoundException 或 web 服务或者网络服务的各种可能的返回值)......所有这些都没有涉及缓慢的访问时间(模拟将证明比在测试中访问此类资源要快得多)。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 当可以设置对象本身并将其传递回单元测试时,是否有必要模拟对象。在那种情况下哪个更可取,为什么?就我而言,我有一个使用 DTO 对象的域层函数。现在,实际上使用 Mockito 编写代码而不是在 DTO 对象中使用 .set 操作并在单元测试中使用它似乎是违反直觉的。示例 - mockObject.setMessage("Hello") v/s Mockito.when(mockDTO.getMessage()).thenReturn("Hello"); 10 /10 次我想采用第一种方法。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          1. 性能

            因为单元测试应该很快,所以测试一个组件 与网络、数据库或其他时间密集型交互 如果使用 mock 完成,resource 不需要支付罚金 对象。节省的费用很快就会增加。

          2. 合作

            如果您正在编写一个封装良好的 需要与其他人的代码交互的代码(没有 已经编写,或正在并行开发 - 一个常见的 场景),您可以使用模拟对象来练习您的代码 接口已约定。否则你的代码可能不会开始 在其他组件完成之前进行测试。

          【讨论】:

            【解决方案7】:

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

            当然不是。有时,手动编写模拟可能非常乏味。但对于简单的事情,它一点也不差。将Last Responsible Moment 的原则应用到 mocking 框架中,只有在您向自己证明手写 mock 麻烦多于其价值时,您才应该从手写 mock 切换到框架。

            如果您刚开始模拟,直接跳入框架至少会使您的学习曲线翻倍(您能翻倍曲线吗?)。当您在几个项目中手动编写模拟时,模拟框架会更加更有意义。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                在下面的链接中,您可以看到 Typemock 对为什么需要 mocking framework 进行单元测试的解释。

                【讨论】:

                  猜你喜欢
                  • 2011-04-05
                  • 1970-01-01
                  • 2010-10-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多