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

如何对从具有大量依赖关系的基类派生的类进行单元测试?

  •  6
  • pauljwilliams  · 技术社区  · 16 年前

    我试图在我继承的一些Java代码中对一个类进行单元测试。

    问题是,它派生自一个类,该类是公司应用程序框架的一部分。在构造时,基类会做各种“聪明”的事情,初始化与运行时所需的各种服务的连接。

    但是为了单元测试的目的,我不需要这些。我只需要创建派生类的一个实例,然后我就可以执行它。如果任何测试特别需要层次结构的一部分,我可以模拟它们。

    So how do I break this dependency?

    4 回复  |  直到 16 年前
        1
  •  3
  •   Sjoerd    16 年前

    所以你有一个基类和一个扩展类。看看是否可以重构扩展类以不再扩展基类,而是使用它。所以你第一次打电话的地方 parent::fooBar() 你现在打电话 this.baseInstance.fooBar() . 这样,您就可以为测试目的注入另一个BaseInstance。

    如果您真的需要扩展基类来覆盖某些内容,请将功能提取到第三个类,并使扩展类成为代理。扩展类只对第三类调用方法。例如。

    protected fooBar() {
        return this.realImplementation.fooBar();
    }
    

    这样,您就可以在不实例化基类的情况下测试实际的实现。

        2
  •  7
  •   duffymo    16 年前

    继承是如此脆弱。

    继承是一项要求吗?基类正在做的所有“聪明”的事情(例如建立连接)都是依赖注入引擎通常会提供的东西。

    从测试和运行时的角度来看,如果您找到一种不继承的方法并让DI引擎满足它的依赖性,那么您的类听起来会更好。可能吗?

        3
  •  1
  •   ram    16 年前

    我们有一个类似的问题,很多框架级别的类和依赖项。我们用DI解决了它

        4
  •  0
  •   Stephen C    16 年前

    我同意其他人的观点,他们认为从长远来看依赖注入是可行的。作为一个短期的黑客,您可以尝试引入一个“全局”标志来禁用智能初始化代码进行测试。