Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 改装2.0+;匕首2.0多个调度程序_Android_Unit Testing_Retrofit2_Dagger 2 - Fatal编程技术网

Android 改装2.0+;匕首2.0多个调度程序

Android 改装2.0+;匕首2.0多个调度程序,android,unit-testing,retrofit2,dagger-2,Android,Unit Testing,Retrofit2,Dagger 2,我目前有一个改进的客户端类来进行网络呼叫。同样的客户端也用于单元测试。我想要的是继续使用相同的类,但如果单元测试应用程序只需切换调度程序,以便同步执行所有网络调用并监控结果 最简单的方法是使用dagger2.0为调度器创建两个提供如下方法的方法: @Provides @Named("RealDispatcher") @Singleton public Dispatcher provideDispatcher() { dispatcher = new Dispatcher();

我目前有一个
改进的
客户端类来进行网络呼叫。同样的客户端也用于单元测试。我想要的是继续使用相同的类,但如果单元测试应用程序只需切换
调度程序
,以便同步执行所有网络调用并监控结果

最简单的方法是使用
dagger2.0为
调度器
创建两个提供如下方法的方法:

@Provides
@Named("RealDispatcher")
@Singleton
public Dispatcher provideDispatcher() {
    dispatcher =  new Dispatcher();
    return dispatcher;
}

@Provides
@Named("TestDispatcher")
@Singleton
public Dispatcher provideTestDispatcher() {
    dispatcher =  new Dispatcher(newSynchronousExecutorService());
    return dispatcher;
}
组件类:

@Singleton
@Component(modules = {RetrofitModule.class})
public interface RetrofitComponent {

    void inject(RestClient restClient);
}
难题是,如何根据调度器处于“默认”模式还是“单元测试”模式动态切换
调度器
。既然注射用
Dagger 2.0
中的类型关联很强,我怎么能一直改变它呢

改装
客户端设置:

public class RestClient {

    private static ApiCall REST_CLIENT;
    @Inject
    @Named("RealDispatcher")
    static Dispatcher dispatcher; ---> need to switch this dynamically

    private static void setupRestClient() {
        retrofitComponent.inject(this);
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(Level.BODY);
        OkHttpClient httpClient = new OkHttpClient();
        httpClient.setDispatcher(dispatcher); ---->add dispatcher based on "default" or "unit testing" mode.
        httpClient.interceptors().add(logging);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(MainActivity.URL)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        REST_CLIENT = retrofit.create(ApiCall.class);
    }

}