android - DaggerMock 库 - 它如何覆盖模块?

标签 android dagger-2

DaggerMock library , 用于用伪造的实现覆盖 Dagger 模块。让我们来看看一个让我感到困惑的机器人电气主题:

 @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的作者,感谢试用!

实现有点复杂,规则创建模块的动态子类(使用 mockito)并覆盖提供的方法。该规则扫描测试字段,以便在模块具有返回相同类型的方法时返回一个字段。

最终的结果和Mockito的InjectMocks注解非常相似。你可以看看github上的实现,覆盖模块的核心类是这样的:https://github.com/fabioCollini/DaggerMock/blob/master/lib/src/main/java/it/cosenonjaviste/daggermock/MockOverrider.java

我在一周前发布了这个库,欢迎任何反馈!

关于android - DaggerMock 库 - 它如何覆盖模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34734037/

相关文章:

Android:如何在连续移动时找到使用 GPS 覆盖的总距离?

java - 带有选项卡和 ViewPager 的 AppBarLayout

android - Google Play 游戏 - alpha/beta 测试中的应用程序 - 登录时出现错误 10004 结果应用程序配置错误

java - 在 Dagger 中实现单例构建器

android - Dagger 2 将 Activity 的 View 模型注入(inject) fragment

android - CustomScope 可能不会引用具有不同范围的绑定(bind)

java - 使用 Volley 的 JSON 请求

android - 如何在Android中计算两个TIMESTAMP之间的时间差

android - Dagger 2 基于上下文的范围

android - 将 @Component.Builder 与构造函数参数一起使用