MockWebServer和带回调的Retrofit

时间:2014-06-30 12:11:42

标签: android retrofit mockwebserver

我想通过MockWebServer模拟网络通信。不幸的改造回调永远不会被调用。我的代码:

    MockWebServer server = new MockWebServer();
    server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));
    server.play();

    RestAdapter restAdapter = new RestAdapter.Builder().setConverter(new MyGsonConverter(new Gson()))
            .setEndpoint(server.getUrl("/").toString()).build();

    restAdapter.create(SearchService.class).getCount(StringUtils.EMPTY,
            new Callback<CountContainer>() {

                @Override
                public void success(CountContainer countContainer, Response response) {
                    System.out.println("success");
                }

                @Override
                public void failure(RetrofitError error) {
                    System.out.println("error");
                }
            });

    server.shutdown();

当我在没有回调的情况下使用改装时,它可以工作。

3 个答案:

答案 0 :(得分:13)

通过让Callback告诉Retrofit调用请求并异步调用回调。这意味着您的测试将在任何事情发生之前退出。

有两种方法可以让它发挥作用:

  • 在测试结束时使用锁并等待,直到调用其中一个回调方法。
  • 将同步Executor的实例(只需立即调用.run()的实例)传递给setExecutors上的RestAdapter.Builder,以便后台调用和回调调用同步进行。

答案 1 :(得分:2)

对于改造2,请在此处查看答案:https://github.com/square/retrofit/issues/1259您可以(通过其调度程序)向OkHttpClient提供同步执行程序,并将此客户机设置为Retrofit.Builder。您还可以将相同的执行程序设置为callbackExecutor。

例如:

CompanyName

CurrentThreadExecutor实现的示例: https://gist.github.com/vladimir-bukhtoyarov/38d6b4b277d0a0cfb3af

答案 2 :(得分:0)

或者,您可以在MockWebServer上使用Mockinizer:

OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .mockinize(mocks) // <-- just add this line
        .build()

您可以在mocks值中定义要模拟的请求/响应。在您的情况下,它将类似于:

package com.appham.mockinizer.demo

import com.appham.mockinizer.RequestFilter
import okhttp3.mockwebserver.MockResponse

val mocks: Map<RequestFilter, MockResponse> = mapOf(

    RequestFilter("/") to MockResponse().apply {
        setResponseCode(200)
        setBody("""{}""")
    }

)

请参见https://github.com/donfuxx/Mockinizer