【问题标题】:MockWebServer with Retrofit and Dagger带有 Retrofit 和 Dagger 的 MockWebServer
【发布时间】:2017-08-06 10:53:22
【问题描述】:

我尝试为我的 android 项目实施仪器测试。在我的主要项目中,我使用了 dagger 和改造,并从我的模块中提供改造。

这是我提供改造的模块:

@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 是怎样的?

【问题讨论】:

    标签: android testing retrofit2 dagger mockwebserver


    【解决方案1】:

    调用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;
    }
    

    【讨论】:

    • 对我不起作用。仍然遇到同样的异常
    猜你喜欢
    • 2018-09-22
    • 2014-09-17
    • 2014-08-20
    • 2016-08-14
    • 2020-10-02
    • 2014-07-30
    • 2017-09-29
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多