DaggerMock 库 - 它如何覆盖模块?
DaggerMock library -how does it override module?
DaggerMock library 用于用虚假实现覆盖 dagger 模块。让我们来看看一个让我困惑的 robolectric 话题:
@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,所以我很困惑该模块最初是如何用于提供任何依赖项的?
我是DaggerMock的作者,感谢试用!
实现有点复杂,规则创建模块的动态子class(使用 mockito)并覆盖提供的方法。该规则扫描测试字段,因此当模块具有 return 相同类型的方法时,它 return 一个字段。
最终结果和Mockito InjectMocks注解非常相似。你可以看看 github 上的实现,覆盖模块的核心 class 是这样的:https://github.com/fabioCollini/DaggerMock/blob/master/lib/src/main/java/it/cosenonjaviste/daggermock/MockOverrider.java
我一周前发布了这个库,欢迎任何反馈!
DaggerMock library 用于用虚假实现覆盖 dagger 模块。让我们来看看一个让我困惑的 robolectric 话题:
@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,所以我很困惑该模块最初是如何用于提供任何依赖项的?
我是DaggerMock的作者,感谢试用!
实现有点复杂,规则创建模块的动态子class(使用 mockito)并覆盖提供的方法。该规则扫描测试字段,因此当模块具有 return 相同类型的方法时,它 return 一个字段。
最终结果和Mockito InjectMocks注解非常相似。你可以看看 github 上的实现,覆盖模块的核心 class 是这样的:https://github.com/fabioCollini/DaggerMock/blob/master/lib/src/main/java/it/cosenonjaviste/daggermock/MockOverrider.java
我一周前发布了这个库,欢迎任何反馈!