该DaggerMock库,用于覆盖假冒实施匕首模块.让我们来看看让我困惑的一个robolectric主题:
@RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class MainActivityTest { @Rule public final DaggerMockRulemockitoRule = new DaggerMockRule<>(MyComponent.class, new MyModule()) .set(new DaggerMockRule.ComponentSetter () { @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提供,但现在被替换为mock.但是在示例中我没有看到任何地方的@Inject,所以我很困惑该模块甚至首先用于提供任何依赖项?
我是DaggerMock的作者,感谢您的尝试!
实现有点复杂,规则创建模块的动态子类(使用mockito)并覆盖提供方法.该规则扫描测试字段,以便在模块具有返回相同类型的方法时返回字段.
最终结果与Mockito InjectMocks注释非常相似.你可以看看github上的实现,覆盖模块的核心类是:https://github.com/fabioCollini/DaggerMock/blob/master/lib/src/main/java/it/cosenonjaviste/daggermock /MockOverrider.java
我在一周前发布了这个lib,欢迎任何反馈!