12

我想通过 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();

当我使用没有回调的改造时,它可以工作。

4

3 回答 3

14

通过有一个Callback你告诉改造调用请求并异步调用回调。这意味着您的测试在任何事情发生之前就退出了。

有两种方法可以让它工作:

  • 在测试结束时使用锁并等待调用回调方法之一。
  • 将同步实例Executor(仅.run()立即调用)传递给setExecutorson,RestAdapter.Builder以便后台调用和回调调用同步发生。
于 2014-06-30T16:23:22.570 回答
3

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

例如:

CurrentThreadExecutor currentThreadExecutor = new CurrentThreadExecutor();
okhttp3.Dispatcher dispatcher = new okhttp3.Dispatcher(currentThreadExecutor);
OkHttpClient okHttpClient = new 
OkHttpClient.Builder().dispatcher(dispatcher).build();

new Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl(httpUrl)
        .addConverterFactory(JacksonConverterFactory.create())
        .callbackExecutor(currentThreadExecutor)
        .build();

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

于 2018-07-09T04:28:35.313 回答
1

或者,您可以将 Mockingizer 与 MockWebServer 一起使用:

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

于 2019-08-05T21:31:11.310 回答