DaggerMock库用于覆盖带有假实现的匕首模块。让我们来看看一个让我困惑的绝密主题:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest {
@Rule public final DaggerMockRule<MyComponent> mockitoRule = new DaggerMockRule<>(MyComponent.class, new MyModule())
.set(new DaggerMockRule.ComponentSetter<MyComponent>() {
@Override public void setComponent(MyComponent component) {
((App) RuntimeEnvironment.application).setComponent(component);
}
});
@Mock RestService restService;
@Mock MyPrinter myPrinter;
@Test
public void testCreateActivity() {
when(restService.doSomething()).thenReturn("abc");
Robolectric.setupActivity(MainActivity.class);
verify(myPrinter).print("ABC");
}
} 所以我想知道,用这个规则到底发生了什么?我可以看到,RestService是由MyModule提供的,但现在正在被模拟替换。但是在这些例子中,我没有看到@Inject,所以我搞不懂模块最初是如何被用来提供任何依赖关系的?
发布于 2016-01-13 08:54:51
我是DaggerMock的作者,谢谢你的尝试!
实现有点复杂,规则创建模块的一个动态子类(使用mockito)并覆盖提供的方法。规则扫描测试字段,因此当模块有返回相同类型的方法时,它返回一个字段。
最后的结果非常类似于Mockito InjectMocks注释。您可以查看github上的实现,覆盖该模块的核心类是:https://github.com/fabioCollini/DaggerMock/blob/master/lib/src/main/java/it/cosenonjaviste/daggermock/MockOverrider.java
就在一周前,我发布了这个库,欢迎任何反馈!
https://stackoverflow.com/questions/34734037
复制相似问题