我正在使用非常简单且可能非常常见的场景。这是我的示例依赖项:
public class MyDependency {
@Inject
public MyDependency(...) {
...
}
}
我没有在任何模块中列出以上内容(也就是说,MyDependency 没有 @Provides
)。
我的示例用例是这样的:
public class ThePresenter {
@Inject
MyDependency myDependency;
public ThePresenter() {
App.getInstance().getAppComponent().inject(this);
}
}
现在我想在单元测试中模拟我的依赖。我不想使用模块覆盖(这意味着我必须为所有标有 @Inject 构造函数的依赖项添加 @Provides)、测试组件等。对于这个问题,除了标准和简单的方法之外,还有其他替代方法吗?
最佳答案
你需要使用构造函数注入(inject),而不是你的注入(inject)点在 Presenter 类构造函数里面。通过在构造函数上添加 @Inject
注释(就像您对依赖项所做的那样),将 Presenter 暴露给 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);
....
}
}
关于android - 模块中未列出的模拟依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837329/