我想通过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();
当我在没有回调的情况下使用改装时,它可以工作。
答案 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("""{}""")
}
)