使用DI的最大好处之一是它使测试变得更容易(What is dependency injection?也支持它)。我使用过的其他编程语言的大多数DI框架( .NET 上的MEF, Obj-C / Swift上的Typhoon ,{ {3}} PHP 上的IoC容器,以及其他一些容器)允许开发人员在每个组件的单个入口点上注册依赖项,从而防止“创建”对象本身的依赖。
在我阅读Laravel文档之后,整个“没有反思”的业务听起来很棒,但我没有看到它如何使测试变得更容易,因为对象仍然在创建自己的依赖项。
例如,在CoffeMaker示例中:
public class CoffeeApp {
public static void main(String[] args) {
// THIS LINE
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
coffeeShop.maker().brew();
}
}
即使你没有明确地调用new
,你仍然需要创建你的依赖。
现在换一个更详细的例子,让我们转到Dagger 2。
如果您打开DemoActivity
课程,您会注意到onCreate
实施如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Perform injection so that when this call returns all dependencies will be available for use.
((DemoApplication) getApplication()).component().inject(this);
}
您可以清楚地看到DI组件与实际代码没有脱钩。总之,您需要在测试用例上模拟/存根((DemoApplication) getApplication()).component().inject(this);
(如果可能的话)。
到目前为止,我知道Dagger 2很受欢迎,所以我不会看到它。那么Dagger 2如何让测试课更容易?我将如何模拟,假设我的活动所依赖的网络服务类?我希望答案尽可能简单,因为我只对测试感兴趣。