2013-07-29 61 views
0

對於單元測試,我如何模擬使用工廠的類的依賴關係。嘲笑使用靜態工廠的類的依賴關係

舉例來說,如果我有下面的類:

public class SignalProcessor 
{ 
    ISignalFilter signalFilter; 

    public SignalProcessor() 
    { 
    this.signalFilter = SignalFilterFactory.GetInstance(); 
    } 
} 

現在在SignalProcessor單元測試,我想模擬出ISignalFilter,即使用ISignalFilter的測試版本。如果我使用依賴注入而不是Factory,那麼我可以將一個TestSignalFilter傳遞給SignalProcessor構造函數。但是,如何在工廠情況下模擬ISignalFilter?

+0

您應該考慮使用類似城堡或Unity一個DI框架(如果你尚未使用)。這些框架提供了將工廠外部化爲XML或類的工具(本身可以進行單元測試)。然後你可以只有一個構造函數「public SignalProcessor(ISignalFilter filter)」。 – aquaraga

回答

0

注入依賴性:

public class SignalProcessor 
{ 
    ISignalFilter signalFilter; 

    public SignalProcessor() : this(SignalFilterFactory.GetInstance()) {} 

    public SignalProcessor(ISignalFilter filter) 
    { 
    this.signalFilter = filter; 
    } 
} 
+0

有趣,所以你正在添加一個新的公共構造函數,它允許依賴注入,僅用於單元測試目的。不一定是壞事,但有其他想法? – AbhishekPrateek

+0

當然,還有很多其他的想法。儘管如此,這是最好的。大多數其他想法是「創造某種狀態然後將其用於測試目的」的變體,它爲通向地獄的道路鋪平了道路。 – tallseth

+1

我甚至會擺脫默認的構造函數。只需提供具有ISignalFilter參數的版本即可。然後signalProcessor類對SignalFilterFactory沒有依賴關係。它不關心如何創建ISignalFilter - 這是調用者的責任。 – GarethOwen