我正在使用非常简单且可能非常常见的场景。这是我的示例依赖项:
public class MyDependency {
@Inject
public MyDependency(...) {
...
}
}
我没有在任何模块中列出上述内容(也就是说,MyDependency没有@Provides
(。
我的示例用例如下所示:
public class ThePresenter {
@Inject
MyDependency myDependency;
public ThePresenter() {
App.getInstance().getAppComponent().inject(this);
}
}
现在我想在单元测试中嘲笑我的依赖关系。我不想使用模块覆盖(这意味着我必须为所有标有@Inject构造函数的依赖项添加@Provides(、测试组件等。除了标准和简单的方法之外,是否有其他方法可以解决这个问题?
您需要使用构造函数注入,而不是在 Presenter 类构造函数中使用注入站点。 通过在构造函数上添加@Inject
注释,将演示器公开给 dagger2(就像您对依赖项所做的那样(:
public class ThePresenter {
private final MyDependency myDependency;
@Inject public ThePresenter(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
然后,这允许反转控制并提供依赖项/模拟。
用法:
public class ThePresenterTest {
@Mock private MyDependency myDependency;
private ThePresenter presenter;
@Before public void setup() {
MocktioAnnotations.initMocks(this);
presenter = new ThePresenter(myDependency);
Mockito.when(myDependency.someMethod()).thenReturn(someValue);
....
}
}
只是嘲笑它?
public class ThePresenterTest {
@Mock MyDependency myDependency;
private ThePresenter presenter;
@Before
public void setup() {
initMocks(this);
presenter = new ThePresenter();
}
}