【问题标题】:How do you test dependent classes that cannot be unit tested together?您如何测试无法一起进行单元测试的依赖类?
【发布时间】:2009-10-09 11:46:20
【问题描述】:

我有一个关于如何测试两个相互依赖但不能一起进行单元测试的类的问题。我无法创建足够短的代码示例,因此我将尝试用假设的类来解释它。抱歉,如果这太混乱了,但我仍在尝试提出一个简洁的例子。

在本例中,我们关注 4 个不同的类:ObjectCreator、ObjectUser1、ObjectUser2 和 Object。在 ObjectUser1 和 ObjectUser2 的单元测试中,每个都显式地构造要使用的 Object 实例。 ObjectCreator 还具有单元测试以确保 Object 实例的“正确”构造。所有单元测试都成功通过。现在,在 ObjectUser1 中发现了一个未在单元测试中公开的错误。此错误是由于 ObjectCreator 创建对象的方式与 ObjectUser1 使用它的方式之间的不兼容造成的。 ObjectUser2 中不存在此错误。该错误的修复是更改 ObjectCreator 构造对象的方式。我面临的问题是,当我更改 ObjectCreator 时,所有单元测试都再次通过,但我知道新更改已经破坏了 ObjectUser2(单元测试通过了 ObjectUser2,因为 Object 是为单元测试构建的方式)。假设出于复杂性原因,我不想在 ObjectUser1 和 ObjectUser2 的单元测试中使用 ObjectCreator。

这是单元测试中的常见问题吗?如果不能一起进行单元测试,那么测试依赖项的最佳方法是什么?对此的任何帮助将不胜感激。

【问题讨论】:

    标签: unit-testing testing


    【解决方案1】:

    在测试 B 类时,MockA。 所以你会从 A 那里得到你想要的结果。但是 B 仍然会依赖它。

    您可以根据需要进行单元测试。并且你保持你的依赖。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 在我的示例中,ObjectUser 与 ObjectCreator 的实现紧密耦合。也许我不完全理解应该如何使用模拟对象,但似乎我需要在模拟中复制真实 ObjectCreator 的实现。你怎么知道模拟的实现与真实对象有多接近?对不起,我对此一无所知。
      • @corey - 模拟的实现应该与具体对象的实现完全无关。听起来问题的症结在于您的ObjectUser 类在某种程度上依赖于ObjectCreator 的实现,这听起来很可疑。您能否在您的问题中澄清这种依赖关系?
      【解决方案3】:

      当对象 A 创建对象 B 时,您似乎没有充分地将 依赖逻辑 从 应用程序逻辑 中分离出来。您想将其删除,以便 A 有一个引用给某种创建对象 B 的提供者。

      我将采取的路线是使用Dependency Injection 将依赖项构造逻辑与应用程序逻辑分开。然而,切换到 DI 框架对您的项目来说可能是一项艰巨的任务。您还有其他可用选项,包括一个简单的静态 factory method,只要您在方法中添加挂钩以强制它返回您需要返回的内容。

      一旦将两者分开,这是一个模拟对象 B 的简单案例。

      【讨论】:

        【解决方案4】:

        在我看来,您的对象耦合得太紧了,可能会被分开。您能否以一种难以解耦的方式重用 Object,并且可能需要两个单独的对象?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多