2017-03-15 71 views
3

我試圖爲我的android項目實施儀器測試。在我的主要項目中,我使用了匕首和改造,並從我的模塊中提供改造。MockWebServer與改造和匕首

這是我的模塊提供改裝:

@Module 
public class NetModule { 

    @Provides 
    @Singleton 
    OkHttpClient.Builder provideOkHttpClientBuilder(){ 
     OkHttpClient.Builder okHttp = new OkHttpClient.Builder(); 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     NoCacheInterceptor noCacheInterceptor = new NoCacheInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     if (!okHttp.interceptors().contains(interceptor)) 
      okHttp.addInterceptor(interceptor); 

     if (!okHttp.interceptors().contains(noCacheInterceptor)) 
      okHttp.addInterceptor(noCacheInterceptor); 

     return okHttp; 
    } 

    @Provides 
    Retrofit provideRetrofit(OkHttpClient.Builder httpClient){ 
     return new Retrofit.Builder() 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(Constant.BASE_URL) 
       .client(httpClient.build()).build(); 
    } 

} 

然後,在我的androidTest文件夾中,我創建TestModule提供改造與MockWebServer象下面這樣:

@Module 
public class TestNetModule { 
    private final MockWebServer mockWebServer; 
    public TestNetModule() { 
     mockWebServer = new MockWebServer(); 
    } 

    @Provides 
    @Singleton 
    MockWebServer providerMockWebServer() { 
     return new MockWebServer(); 
    } 

    @Provides 
    @Singleton 
    OkHttpClient.Builder provideOkHttpClientBuilder(){ 
     OkHttpClient.Builder okHttp = new OkHttpClient.Builder(); 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     NoCacheInterceptor noCacheInterceptor = new NoCacheInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     if (!okHttp.interceptors().contains(interceptor)) 
      okHttp.addInterceptor(interceptor); 

     if (!okHttp.interceptors().contains(noCacheInterceptor)) 
      okHttp.addInterceptor(noCacheInterceptor); 

     return okHttp; 
    } 

    @Provides 
    Retrofit.Builder provideRetrofitBuilder(OkHttpClient.Builder httpClient, MockWebServer mockWebServer){ 
     return new Retrofit.Builder() 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(mockWebServer.url("/").toString()) 
       .client(httpClient.build()).build(); 
    } 
} 

當我跑我的測試,我總是在代碼.baseUrl(mockWebServer.url("/").toString())處得到錯誤android.os.NetworkOnMainThreadException。如何正確地實施MockWebServer的改進和匕首測試?

回答

3

調用mockWebServer.url("/")啓動服務器,這是主線程無法完成的操作。

我解決了這個像這樣:

@Provides 
@Singleton 
MockWebServer providerMockWebServer() { 
    MockWebServer mockWebServer = new MockWebServer() 
    Thread thread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       mockWebServer.start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
    return mockWebServer; 
}