OkHttp拦截器不会从Observable调用

时间:2015-07-15 20:19:36

标签: android retrofit rx-java observable okhttp

我正在尝试为Android中的RX Observable调用编写单元测试。我正在设置我的Retrofit RestAdapter:

        RestAdapter.Builder restAdapter = new RestAdapter.Builder();
        restAdapter
                .setEndpoint(BuildConfig.API_URL)
                .setConverter(new GsonConverter(getGson()))
                .setClient(new OkClient(getHttpClient()));

我正在传递一个像这样的OkHttpClient:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new AuthenticationInterceptor());

但是,我的Observable调用都没有被截获。事实上,似乎网络呼叫不会启动AT ALL。有人遇到过类似的问题吗?

编辑: 以下是我从单元测试中调用Observable的方法

TestSubscriber<User> testSubscriber = new TestSubscriber<>();
    mLoginUtils.doEmailLogin("customer", new AuthCredentials("test@mail.com", "testpassword")).subscribe(testSubscriber);

2 个答案:

答案 0 :(得分:4)

您需要订阅Observable,否则不会被激活。

显然Retrofit将其实现为“冷可观察性”。

来自ReactiveX docs

  另一方面,“冷”观察者等待观察者   在它开始发出项目之前订阅它,所以这样   观察者保证从一开始就看到整个序列。

答案 1 :(得分:1)

我不确定为什么你的OkHttp拦截器没有被调用。我一直使用Retrofit请求拦截器。如果您只是想添加一个适合您的身份验证标头。以下是基于代码的示例:

// Create the OkHttp client        
OkHttpClient okHttpClient = new OkHttpClient();
SSLContext sslContext;
try {
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, null, null);
} catch (GeneralSecurityException e) {
    throw new AssertionError(); // The system has no TLS. Just give up.
}
Client client = okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());

// Create the Retrofit RestAdapter
RestAdapter.LogLevel logLevel = BuildConfig.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE;
return new RestAdapter.Builder()
        .setEndpoint(BuildConfig.API_URL)
        .setClient(client)
        .setConverter(new GsonConverter(getGson()))
        .setRequestInterceptor(new RetrofitAuthenticationInterceptor())
        .setLogLevel(logLevel)
        .build()
        .create(ApiServiceV1.class);