【问题标题】:Too many dependencies in Mocking : Unit test questionMocking 中的依赖项太多:单元测试问题
【发布时间】:2011-01-28 17:13:23
【问题描述】:

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

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

【问题讨论】:

  • 你能提供一个更具体的例子吗?

标签: unit-testing mocking dependencies mockito


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我喜欢做的是创建一个类,该类具有所有外部依赖项的字段以及静态方法。例如:

    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 您可以使用 IoC(我喜欢 Guice),但这并不总是一种选择(有些项目只是不允许您放入任何您喜欢的罐子)。它只是一个技巧,可以帮助您记住必须模拟哪些数据。另外,如果他有太多依赖项,这听起来是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多