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

Pau*_*ams 6 java unit-testing

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

问题是它来自一个类,它是公司应用程序的一部分.在构造时,基类会执行各种"聪明"的东西,初始化与运行时所需的各种服务的连接.

但是对于单元测试目的,我不需要任何这些.我只需要创建一个派生类的实例,然后我就可以锻炼它.如果任何测试特别需要层次结构的一部分,我可以嘲笑它们.

那么我该如何打破这种依赖呢?

duf*_*ymo 7

继承可以是如此脆弱.

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

如果您找到一种不继承并通过DI引擎满足其依赖关系的方法,那么您的类听起来会更好地从测试和运行时的角度来看.可能?


Sjo*_*erd 3

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

如果您确实需要扩展基类来覆盖某些内容,请将功能提取到第三个类并使扩展类成为代理。扩展类除了调用第三个类的方法之外什么也不做。例如

protected fooBar() {
    return this.realImplementation.fooBar();
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以测试真正的实现,而无需实例化基类。