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

Для проекта Android я настроил Retrofit 2.1.0 и OkHttp 3.4.1 с помощью Dagger 2.6, как показано в следующем кинжальном модуле. Я @Named поддерживать несколько @Named с помощью @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); 

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

 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 или даже переключения между промежуточными конечными точками для отладочных сборников.