我想测试一个Business类,我遇到了这个问题:其中一个模拟对象与其他类有很多依赖关系,比如Sites,URL和ComplexObject。
我的问题是:如果我必须在我需要测试的方法中使用我的模拟对象的这个方法,我如何隔离我的类?我应该模仿所有这些并将它们添加到模拟对象吗?
答案 0 :(得分:4)
你还能怎么测试它?看起来你需要模拟依赖项。一个积极的方面是你可以在其他需要测试的类中使用模拟。请注意,这是明确的code smell。
你有没有想过dependency injection?如果您传入了所有依赖项,则可以创建一个生成一组测试依赖项的工厂,然后只覆盖测试所需的依赖项。
答案 1 :(得分:0)
我喜欢做的是创建一个具有所有外部依赖项的字段以及静态方法的类。例如:
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.
}
}
我知道纯粹主义者更愿意将所有内容注入课堂,但我发现这种测试方式更为简单。尝试一下,看看你对它的看法(我打赌它不是最好的实践或设计模式,但我喜欢它。)