我目前正在嘗試改進用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 –