使用依赖注入和模拟对象时的分配位置

时间:2013-07-12 13:04:47

标签: dependency-injection mocking tdd

据我所知,为了方便测试过程,应该使用依赖注入作为设计原则。如果我没有错,我应该宣布它是公开的,让别人做这个工作,而不是分配我将要使用的对象;在这种情况下,测试和创建模拟。但是,为了使用真实对象,最终我将不得不分配它。但是,在哪里?

我使用了懒惰实例化来允许模拟对象在真实对象上发生,当它没有时,当我运行应用程序时,将使用真实对象。它完成了工作但我被告知以这种方式使用惰性实例化不是一个好习惯;特别是,当要分配的对象需要不同的参数时。例如,NSURLConnection。

使用该对象的类是ViewController,因此它是最后一个“客户端”。我没有其他类可以委托对象的分配,如果我分配它,比如说,viewDidLoad那么我将无法模拟该对象。

1 个答案:

答案 0 :(得分:1)

这就是创建依赖注入(DI)容器的原因。他们负责在运行时创建对象的实例。在正确连接时,您不必在类中编写单行代码。通常,所有类都在其构造函数中声明它们的依赖关系。

public class SomeClass
{
    public SomeClass(ISomeDependency dependency)
    {
        //assing dependency to a field etc
    }
}

当您的应用程序需要创建SomeClass类型的实例时,它会将其委托给DI容器。容器将检查构造函数并发现它必须首先提供ISomeDependency的实例。容器保留了映射到抽象的具体类型的列表。这些列表由代码,配置文件或某些约定创建。当容器找到ISomeDependency接口的具体类型时,它会尝试以相同的方式创建它的实例。这将持续到提供所有依赖项并且您获得SomeClass的实例。这些依赖关系也可以在单元测试中轻松替换为测试双精度。

DI容器是复杂的库,它们不仅仅是创建对象图。他们还管理他们创建的对象的生命周期。由于您尚未自己创建对象,因此必须在不再需要时通知容器。您的应用程序应该为容器提供第二个挂钩。这些挂钩是特定于每个平台的,您可以轻松找到连接流行容器的示例。