如Dagger文档所建议的,对于单元测试,我们不必涉及Dagger,并且对于提供的示例,这是有道理的:
class ThingDoer {
private final ThingGetter getter;
private final ThingPutter putter;
@Inject ThingDoer(ThingGetter getter, ThingPutter putter) {
this.getter = getter;
this.putter = putter;
}
String doTheThing(int howManyTimes) { /* … */ }
}
使用这种类结构进行单元测试非常简单,只需模拟
getter
和putter
,将它们作为构造函数的参数传递,告诉mockito与这些对象交互时应返回什么,然后对doTheThing(...)
进行断言即可。我在测试时遇到困难的是当我需要对一个类进行单元测试时,其结构类似于以下内容:
class ThingDoer {
@Inject
ThingGetter getter;
@Inject
ThingPutter putter;
@Inject
ThingMaker maker;
@Inject
// other 10 objects
public ThingDoer() {
App.getThingComponent().inject(this);
}
String doTheThing(int howManyTimes) { /* … */ }
}
如您所见,我不再使用构造函数注入,而是改用字段注入。主要原因是避免构造函数中有太多参数。
当所有依赖都使用字段注入提供时,是否有办法在 ThingDoer
中注入模拟依赖项?
onCreate
中使用的注入字段,则在您可以替换它之前就已经使用了它。在这种情况下,您可以创建一个使用测试组件和测试模块的测试应用程序。测试模块提供了一个模拟,并且您可以在测试组件上添加一个getter以引用该模拟。 - benji