我试图在我继承的一些Java代码中对一个类进行单元测试。
问题在于它来自一个类,该类是公司应用程序的一部分。在构建时,基类会执行各种“聪明”的东西,初始化与运行时所需的各种服务的连接。
但是对于单元测试目的,我不需要任何这些。我只需要创建一个派生类的实例,然后我就可以锻炼它。如果任何测试特别需要层次结构的一部分,我可以嘲笑它们。
那么我该如何打破这种依赖呢?
答案 0 :(得分:7)
继承可能很脆弱。
继承是一项要求吗?基类正在做的所有“聪明”的东西(例如,建立连接)是依赖注入引擎通常会提供的东西。
如果你找到一种不继承并通过DI引擎满足其依赖关系的方法,你的类听起来会比测试和运行时更好。可能的?
答案 1 :(得分:3)
所以你有一个基类和一个扩展类。看看你是否可以重构扩展类以不再扩展基类,而是使用它。因此,您首次调用parent::fooBar()
的位置,现在调用this.baseInstance.fooBar()
。这样,您可以注入另一个baseInstance用于测试目的。
如果您确实需要扩展基类以覆盖某些内容,请将该功能提取到第三个类,并使扩展类成为代理。扩展类除了调用第三个类的方法之外别无其他。 E.g。
protected fooBar() {
return this.realImplementation.fooBar();
}
这样,您可以测试实际的实现,而无需实例化基类。
答案 2 :(得分:1)
我们遇到了类似的问题。很多框架级别的类和依赖项。我们用DI
解决了这个问题答案 3 :(得分:0)
我同意其他人的观点,他们认为依赖注入是长远发展的方法。作为一个短期黑客,您可以尝试引入一个“全局”标志,禁用用于测试的聪明的初始化代码。