代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

接口如何使单元测试和模拟更容易?

  •  14
  • GurdeepS  · 技术社区  · 14 年前

    5 回复  |  直到 7 年前
        1
  •  8
  •   WooYek    7 年前

    特别是在集成测试中,您能够给出依赖系统模型的版本(例如,web服务)。 而不是打电话 一个依赖的系统或模块,或 复杂且难以实例化类型 提供最简单的接口实现 这将提供所需的结果 使单元测试正确完成 .

    除此之外, (称之为BigGraph)在它后面隐藏一个复杂的对象模型,实际上您是在进行集成测试而不是单元测试。 (BigGraph),而不是您正在测试的类型,因此不是单元测试。使用 实体模型降低了这种风险

    我见过许多连续集成系统在一个bug上显示出几十个错误,而它们应该显示一个,或者最多显示几个错误,所有这些都是因为太复杂的对象模型,以及编写错误的单元测试—不使用模型。

    今天的模拟框架比以前更加复杂(字节码修改等),所以有时并不总是需要接口甚至虚拟方法,但无神经的接口使它们成为可能。

    接口将无济于事 对象模型过于复杂和混乱 (例如,您的接口严重依赖于其他类型/接口);然后 实施/嘲笑这一切是一种痛苦 .

        2
  •  7
  •   Aaron Digulla    14 年前

    • 疯狂的构造器(很多参数,或者它需要其他类,需要第三个类,需要第四个类,需要一个有效的数据库连接)

    • 这个类有一个状态。在测试过程中,由于某种原因,此状态可能会发生变化。

    在许多测试中,这些依赖关系通常是不相关的,您不必处理它们。

    通过一个接口,您可以创建一个简单的mock类,它只实现您需要的几个方法。大多数模拟框架都内置了对此的支持。”这里的Implement通常是指“返回一个固定值”。这样,就可以快速构建被测类所需的环境。

    例如,如果类需要从数据库中读取记录,则可以模拟 ResultSet

        3
  •  4
  •   Janusz Daniel Rindt    14 年前

    如果有多个对象具有不同的实现,但对外提供相同的方法,共享相同的接口,则可以编写一个单元测试并针对所有实现运行它。

    如果你有一个类说把东西发布到web后端,然后检索一个有问题的答案单元测试,因为失败的internet连接可能会让你的测试失败。因此,您可以为这个类定义一个接口,然后编写第二个实现来记录应该发送的内容并提供正确的答案。通过这种方式,您可以在测试运行时不依赖internet连接而从后端测试使用答案的类。

        4
  •  2
  •   Marek    14 年前

    如果没有绑定到具体的实现,则可以在接口后面切换行为。

    如果你的类实现了接口,行为就可以被模仿。

    例如,您不需要向数据库中的所有客户发送垃圾邮件来测试邮件通知算法是否有效。您将为您的 IMailSender

    在这个特定的示例中,测试使用一个模拟实现 iMail发送器 这只计算发送的电子邮件,而实际的生产代码将使用实现 iMail发送器

        5
  •  0
  •   herman    11 年前

    当测试跨端口的行为时,为适配器提供一个接口将有助于在测试期间注入不同的实现(即 test double ).