4

我想做一个业务类的测试,但我遇到了这个问题:其中一个模拟对象对其他类有很多依赖关系,例如 Sites、URL 和 ComplexObject。

我的问题是:如果我必须在我需要测试的方法中使用我的模拟对象的这个方法,我该如何隔离我的类?我应该模拟所有这些并将它们添加到模拟对象吗?

4

2 回答 2

4

你还能如何测试它?看起来您需要模拟依赖项。一个积极的方面是您可能会在其他需要测试的类中使用模拟。请注意,这是一种明确的代码异味

你有没有想过依赖注入?如果您传入所有依赖项,您可以创建一个生成一组测试依赖项的工厂,然后仅覆盖测试所需的依赖项。

于 2011-01-28T17:53:57.047 回答
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.
    }
}

我知道纯粹主义者更愿意将所有内容都注入到类中,但我发现这种测试方式要简单得多。试试看,看看你的想法(我打赌它不是最佳实践或设计模式,但我喜欢它)。

于 2011-01-28T18:53:22.797 回答