【发布时间】:2015-12-05 21:31:06
【问题描述】:
使用 DI 的最大优势之一是它使测试变得更加容易(What is dependency injection? 也支持它)。我在其他编程语言上使用过的大多数 DI 框架(.NET 上的MEF,Obj-C/Swift 上的Typhoon,Laravel's PHP 上的 IoC Container 和其他一些)允许开发人员在每个组件的单个入口点上注册依赖项,从而防止“创建”对对象本身的依赖项。
阅读Dagger 2 文档后,整个“无反射”业务听起来很棒,但我看不出它如何使测试更容易,因为对象仍在创建自己的依赖项。
例如,在 CoffeMaker 示例中:
public class CoffeeApp {
public static void main(String[] args) {
// THIS LINE
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
coffeeShop.maker().brew();
}
}
即使您没有显式调用 new,您仍然需要创建依赖项。
现在来看一个更详细的示例,让我们转到Android Example。
如果你打开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 如何让测试类变得更容易呢?我将如何模拟,比如说我的 Activity 所依赖的网络服务类?我希望答案尽可能简单,因为我只对测试感兴趣。
【问题讨论】:
标签: android unit-testing dependency-injection dagger-2