我目前正在尝试改进用Java编写的遗留系统的可测试性。目前最为棘手的问题是存在无法嘲笑的“内部”依赖关系。解决这个问题非常简单:引入依赖注入。使用构造函数注入和默认构造函数是不好的?
不幸的是,代码库非常大,所以在整个应用程序中引入依赖注入将是一个巨大的努力,直到“引导”。对于每个我想测试的课程,我都需要改变另外的一百个(也许我在这里夸大了一点,但肯定会很多)类,这取决于已更改的组件。
现在我的问题:是否可以,使用两个构造函数,默认构造函数初始化实例字段的默认值和另一个允许注入依赖关系?使用这种方法有什么缺点吗?它将允许依赖注入以备将来使用,但仍不需要改变现有的代码(尽管被测试的类)。
当前代码(“内部”的依赖):
public class ClassUnderTest {
private ICollaborator collab = new Collaborator();
public void methodToTest() {
//do something
collab.doComplexWork();
//do something
}
}
在默认/ DI构造:
public class ClassUnderTest {
private ICollaborator collab;
public ClassUnderTest() {
collab = new Collaborator();
}
public ClassUnderTest(ICollaborator collab) {
this.collab = collab;
}
public void methodToTest() {
//do something
collab.doComplexWork();
//do something
}
}
这对我来说看起来很不错。只要确保您可以使用实例字段,而不是在每次方法调用时重新实例化新实例。这两个片段并不等同。如果必须在每个方法调用时创建新实例,则注入协作者的工厂而不是注入协作者。 –
哦,你当然是对的。当我创建这个例子时,我没有想到它。我将编辑示例。 – user1159435
这被称为混蛋注射,并可能有问题:http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defa –