我是一個Java開發誰是開始把握依賴注射的全部功能,並且它突然對我說明白沒有辦法注入一個靜態方法。所以這讓我想到:是靜態方法DI反模式?靜態方法是DI反模式嗎?
更重要的是:如果我要擁抱依賴注入,這是否意味着我必須停止編碼靜態方法?我問,因爲沒有辦法嘲笑他們,並在單元測試期間注入模擬靜態,這對我來說是一個巨大的關閉。
編輯:我知道,一個共同的方式來「包裝」,並注入現有的靜態方法是這樣的:
public class Foo {
public static void bar() { ... }
}
public interface FooWrapper {
public void bar();
}
public class FooWrapperImpl implements FooWrapper {
public void bar() {
return Foo.bar();
}
}
...但我不問如何注入現有的靜態方法......如果我所有的代碼(從這個角度來看)都會接受DI的概念,我會問我是否應該停止寫下它們。
而且,我看到很多類似的相關問題,這一點,但無法找到問同樣的問題完全匹配。如果你發現這確實是另一個問題,請給我指出,我會自己解決這個問題(請不要只是關閉它!)。
所以,如果我有一個叫做'嘶嘶聲()'方法,並在其中我做一個靜態調用到'Widget.buzz()'方法,它擊中一個數據庫,併發出各種變化,以我的本地文件系統,那麼如何測試'fizz()'而不用調用'Widget.buzz()'調用所有的巨大變化呢?我的觀點是,我認爲我應該停止完全編寫靜態方法,以便我可以在運行時注入正確的'Widget'對象(正常vs模擬),然後控制哪個「版本」的buzz()會觸發。思考? – IAmYourFaja 2012-02-20 20:08:13
'Widget.buzz()'具有關聯的靜態狀態 - 數據庫和隱式的整個文件系統。這是邪惡的。 'fizz'可能需要一個'Widget'參數,並且你會嘲笑一個'Widget'來測試'fizz'。 – 2012-02-20 20:11:28
啊,我從來沒有想過數據庫或文件系統是有狀態的。你用什麼標準來定義「有狀態」?我認爲這是我誤解的根源。 – IAmYourFaja 2012-02-20 20:15:50