Dagger 2.11 - 在验收测试中注入不同的networkAPI实现

时间:2017-11-08 07:42:21

标签: java android unit-testing dagger-2

我有一个简单的应用程序。它使用网络API(Volley)。它使用Dagger 2.11(使用AndroidInjector)进行依赖性反转。 NetworkAPI是在MainActivity中注入的。对于验收测试,我使用自己的TestRunner,从AndroidJUnitRunner扩展。

为了伪造真正的网络API,我使用了ImmediateResponseNetwork对象。这个“网络”立即响应。该实例由TestNetworkApiModule提供,并在TestAppComponent的模块列表中声明。请参阅下面的部分源代码。

有时,在我使用Dagger之前,我使用ImmediateResponseNetwork来定义networkRequest的不同响应,取决于测试。现在似乎不可能,因为网络隐藏在被测活动中。在创建网络后,我无法从外部访问它以进行准备。

我也无法测试较慢的网络连接。这就是为什么我想至少注入另一个假的慢响应网络对象,我希望能够通过ImmediateResponseNetwork准备响应。 我怎么能这样做?

我想写的一个示例测试是: 测试,当网络请求正在运行时,显示加载指示符。

我现在不知道如何实现这一点。看起来,DI是为了更容易测试,而不是相反。 我想,我的想法中缺少一些东西。

问题所依据的源代码:https://github.com/Minsky/SO_Question_AndroidInjectionInTestsWithDagger

样本测试,我想这样做:

@Rule
public ActivityTestRule<MainActivity> mainActivityTestRule = new ActivityTestRule<>(MainActivity.class, true, false);

public void afterStartLoadingPleaseWaitInfoIsDisplayed() throws Exception {
        MainActivityTestRule.launchActivity(new Intent());
        onView(withId(R.id.activity_loading_indicator)).check(matches(isDisplayed()));
    }

我的相关测试设置类:

@Module
public class TestNetworkApiModule extends NetworkApiModule {
    @Provides
    static NetworkApi provideNetworkApi(Context context) {
        return new ImmediateResponseNetwork();
    }
}
@Singleton
@Component(modules = {
        AppModule.class,
        TestNetworkApiModule.class,
        ActivityBindingModule.class,
        AndroidSupportInjectionModule.class
})
public interface TestAppComponent extends AppComponent {
    void inject(TestMyApplication app);
    @Override
    void inject(DaggerApplication instance);

    @Component.Builder
    interface Builder {
        @BindsInstance
        TestAppComponent.Builder application(Application application);
        TestAppComponent build();
    }
}
public class TestMyApplication extends DaggerApplication {
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        TestAppComponent appComponent = DaggerTestAppComponent.builder().application(this).build();
        appComponent.inject(this);
        return appComponent;
    }
}

注入networkAPI的活动:

public class MainActivity extends AppCompatActivity {
    private TextView responseView;
    private boolean progressBarVisible;
    @Inject
    NetworkApi networkApi;
    ...

    }

0 个答案:

没有答案