Как поддерживать несколько конечных точек с Dagger 2.0 при использовании MockWebServer

Для проекта Android я настроил Retrofit 2.1.0 и OkHttp 3.4.1 с Dagger 2.6, как показано в следующем модуле Dagger. Я стремлюсь поддерживать несколько бэкэндов, используя @Named классификаторы.

@Module
public class ApiModule {

    private static final String GITHUB_QUALIFIER = "GitHub";

    private static final String TWITTER_QUALIFIER = "Twitter";

    @Provides
    GitHubClient provideGitHubClient(@Named(GITHUB_QUALIFIER) Retrofit retrofit) { /* ... */ }

    @Provides
    TwitterClient provideTwitterClient(@Named(TWITTER_QUALIFIER) Retrofit retrofit) { /* ... */ }

    @Named(GITHUB_QUALIFIER)
    @Provides
    @Singleton
    HttpUrl provideGitHubBaseUrl() { /* ... */ }

    @Named(TWITTER_QUALIFIER)
    @Provides
    @Singleton
    HttpUrl provideTwitterBaseUrl() { /* ... */ }

    @Named(GITHUB_QUALIFIER)
    @Provides
    @Singleton
    Retrofit getGitHubRetrofit(@Named(GITHUB_QUALIFIER) HttpUrl httpUrl, 
                               OkHttpClient okHttpClient) { /* ... */ }

    @Named(TWITTER_QUALIFIER)
    @Provides
    @Singleton
    Retrofit getTwitterRetrofit(@Named(TWITTER_QUALIFIER) HttpUrl httpUrl, 
                                OkHttpClient okHttpClient) { /* ... */ }

    private Retrofit getRetrofit(String baseUrl, 
                                 OkHttpClient okHttpClient) { /* ... */ }

    @Provides
    @Singleton
    public OkHttpClient provideOkHttpClient() { /* ... */ }

}

Я хочу использовать MockWebServer для тестирования. Однако я не могу узнать, как передать URL-адрес MockWebServer, одновременно поддерживая несколько бэкэндов:

// From a unit test

mockWebServer = new MockWebServer();
mockWebServer.start();
ApiModule apiModule = new ApiModule();
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

String url = mockWebServer.url("/").toString();
// Here I cannot pass the URL to Retrofit
Retrofit retrofit = apiModule.provideRetrofit(/* HERE */ okHttpClient);

gitHubClient = apiModule.provideGitHubClient(retrofit);

1 ответ

Можно переопределить базовый URL с помощью перехватчика ohttp.

public final class HostSelectionInterceptor implements Interceptor {
    private volatile String mHost;

    public void setHost(String host) {
        this.mHost = checkNotNull(host);
    }

    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        String host = this.mHost;
        if (host != null) {
            HttpUrl overriddenBaseUrl = HttpUrl.parse(host);
            HttpUrl newUrl = request.url()
                    .newBuilder()
                    .host(overriddenBaseUrl.host())
                    .build();
            request = request.newBuilder()
                    .url(newUrl)
                    .build();
        }
        return chain.proceed(request);
    }
}

Взято отсюда: https://gist.github.com/swankjesse/8571a8207a5815cca1fb

Этот перехватчик можно использовать для подачи URL-адреса MockWebServer или даже переключения между промежуточными конечными точками для отладочных сборок.

Другие вопросы по тегам