我想對Business類進行測試,並且出現此問題:其中一個模擬對象對其他類(如站點,URL和ComplexObject)具有很多依賴關係。Mocking中的依賴關係過多:單元測試問題
我的問題是:如果我必須在我需要測試的方法中使用我的模擬對象的這種方法,我該如何隔離我的類?我應該嘲笑他們並將他們添加到嘲弄的對象?
我想對Business類進行測試,並且出現此問題:其中一個模擬對象對其他類(如站點,URL和ComplexObject)具有很多依賴關係。Mocking中的依賴關係過多:單元測試問題
我的問題是:如果我必須在我需要測試的方法中使用我的模擬對象的這種方法,我該如何隔離我的類?我應該嘲笑他們並將他們添加到嘲弄的對象?
你還能如何測試它?看起來你需要模擬依賴關係。一個積極的方面是,你可能會在其他需要測試的類中使用mock。請注意,這是一個確定的code smell。
您是否想過dependency injection?如果你傳遞了所有的依賴關係,你可以創建一個工廠來生成一組測試依賴關係,然後重寫你測試所需的依賴關係。
我喜歡做的是創建一個具有所有外部依賴項和靜態方法的字段的類。例如:
public class DanceMakerDependecies{
private URL url;
public String getCurrentUser(){ // not static, so very easy to test
return UserManager.currentUser().getName();
}
//getter and setters
}
public class DanceMaker{
public DanceMaker(DanceMakerDependecies dep){
..
}
// you could also create default constructor with the default dependencies
}
public class DanceMakerTest{
@Test
void dance(){
DanceMaker dm = new DanceMaker();
dm.setDependecies(EasyMock.createMock(DanceMakerDependecies.class));
//etc.
}
}
我知道,純粹主義者會傾向於只是一切注入類,但我發現測試更簡單的這種方式。嘗試一下,看看你的想法(我敢打賭它不是最佳實踐或設計模式,但我喜歡它)。
爲什麼不使用IoC容器? – TrueWill 2011-01-28 19:45:20
你能提供一個更具體的例子嗎? – 2011-01-28 17:26:30