模块中未列出的模拟依赖项
Mocking dependency not listed in module
我正在使用非常简单且可能非常常见的场景。这是我的示例依赖项:
public class MyDependency {
@Inject
public MyDependency(...) {
...
}
}
我没有在任何模块中列出以上内容(也就是说,MyDependency 没有 @Provides
)。
我的示例用例是这样的:
public class ThePresenter {
@Inject
MyDependency myDependency;
public ThePresenter() {
App.getInstance().getAppComponent().inject(this);
}
}
现在我想在单元测试中模拟我的依赖。我不想使用模块覆盖(这意味着我必须为所有标有 @Inject 构造函数的依赖项添加 @Provides)、测试组件等。除了标准和简单的方法之外,还有其他方法可以解决这个问题吗?
只是模拟一下?
public class ThePresenterTest {
@Mock MyDependency myDependency;
private ThePresenter presenter;
@Before
public void setup() {
initMocks(this);
presenter = new ThePresenter();
}
}
您需要使用构造函数注入,而不是您在 Presenter 内部的注入站点 class 构造函数。通过在构造函数上添加 @Inject
注释(就像您对依赖项所做的那样),将 Presenter 暴露给 dagger2:
public class ThePresenter {
private final MyDependency myDependency;
@Inject public ThePresenter(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
然后允许反转控制并提供 dependency/mock。
用法:
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 MyDependency {
@Inject
public MyDependency(...) {
...
}
}
我没有在任何模块中列出以上内容(也就是说,MyDependency 没有 @Provides
)。
我的示例用例是这样的:
public class ThePresenter {
@Inject
MyDependency myDependency;
public ThePresenter() {
App.getInstance().getAppComponent().inject(this);
}
}
现在我想在单元测试中模拟我的依赖。我不想使用模块覆盖(这意味着我必须为所有标有 @Inject 构造函数的依赖项添加 @Provides)、测试组件等。除了标准和简单的方法之外,还有其他方法可以解决这个问题吗?
只是模拟一下?
public class ThePresenterTest {
@Mock MyDependency myDependency;
private ThePresenter presenter;
@Before
public void setup() {
initMocks(this);
presenter = new ThePresenter();
}
}
您需要使用构造函数注入,而不是您在 Presenter 内部的注入站点 class 构造函数。通过在构造函数上添加 @Inject
注释(就像您对依赖项所做的那样),将 Presenter 暴露给 dagger2:
public class ThePresenter {
private final MyDependency myDependency;
@Inject public ThePresenter(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
然后允许反转控制并提供 dependency/mock。
用法:
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);
....
}
}