在 Dagger 2 中模拟注入的构造函数
Mocking Injected Constructors in Dagger 2
我有一个 activity 具有依赖性:
public class MyActivity extends AppCompatActivity {
@Inject Dependency;
@Override
protected void onCreate(Bundle savedInstanceState) {
// inject
}
}
public class Dependency {
@Inject
public Dependency() {
//..
}
}
由于Dependency
有一个注入的构造函数,Dagger2不需要一个模块来知道如何实例化它,这非常方便。
我的问题是:出于测试目的,我是否必须有一个提供 Dependency
的显式模块才能模拟它并提供 Dependency
的模拟版本?或者有没有办法在没有它的情况下模拟 Dependency
?
我找到了一种无需创建显式模块的方法。以下是我使用 Robolectric 和 Mockito 的方法:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MyActivityTest {
@Mock AppComponent mAppComponent;
@Mock private Dependency mDependency;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
// ***
// use the mock AppComponent to perform injections
// ***
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
((MyActivity) invocation.getArguments()[0]).mDependecy = mDependecy;
return null;
}
}).when(mAppComponent).inject(any(MyActivity.class));
}
}
我有一个 activity 具有依赖性:
public class MyActivity extends AppCompatActivity {
@Inject Dependency;
@Override
protected void onCreate(Bundle savedInstanceState) {
// inject
}
}
public class Dependency {
@Inject
public Dependency() {
//..
}
}
由于Dependency
有一个注入的构造函数,Dagger2不需要一个模块来知道如何实例化它,这非常方便。
我的问题是:出于测试目的,我是否必须有一个提供 Dependency
的显式模块才能模拟它并提供 Dependency
的模拟版本?或者有没有办法在没有它的情况下模拟 Dependency
?
我找到了一种无需创建显式模块的方法。以下是我使用 Robolectric 和 Mockito 的方法:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MyActivityTest {
@Mock AppComponent mAppComponent;
@Mock private Dependency mDependency;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
// ***
// use the mock AppComponent to perform injections
// ***
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
((MyActivity) invocation.getArguments()[0]).mDependecy = mDependecy;
return null;
}
}).when(mAppComponent).inject(any(MyActivity.class));
}
}