2016-08-02 14 views
5

Androidプロジェクトの場合、次のDaggerモジュールに示すように、Retrofit 2.1.0とOkHttp 3.4.1をDagger 2.6で設定しました。 @Named修飾子を使用して複数のバックエンドをサポートすることを目指しています。MockWebServerを使用してDagger 2.0で複数のエンドポイントをサポートする方法

@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をテスト用に使用します。しかし、私は、同時に複数のバックエンドをサポートしながら、私はMockWebServerのURLに渡すことができる方法を見つけることができません。

// 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); 

答えて

0

okhttpインターセプタでベースURLを上書きすることが可能です。

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); 
    } 
} 

はここから撮影:あなたはMockWebServer URLを養うために、このインターセプタを使用したり、デバッグビルドのためのステージングエンドポイント間で切り替えることができ https://gist.github.com/swankjesse/8571a8207a5815cca1fb

関連する問題