Android MockWebServer及其回调改造

Android MockWebServer及其回调改造,android,retrofit,mockwebserver,Android,Retrofit,Mockwebserver,我想通过MockWebServer模拟网络通信。不幸的是,改装回调从未调用。我的代码: MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); server.play(); RestAdapter restAdapter = new RestAdapter.Builder().setConv

我想通过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();
MockWebServer服务器=新建MockWebServer();
enqueue(newmockresponse().setResponseCode(200.setBody(“{}”));
server.play();
RestAdapter RestAdapter=new RestAdapter.Builder().setConverter(new MyGsonConverter(new Gson()))
.setEndpoint(server.getUrl(“/”).toString()).build();
create(SearchService.class).getCount(StringUtils.EMPTY,
新回调函数(){
@凌驾
public void成功(CountContainer CountContainer,响应){
System.out.println(“成功”);
}
@凌驾
公共无效失败(错误){
System.out.println(“错误”);
}
});
server.shutdown();

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

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

有两种方法可以实现这一点:

  • 在测试结束时使用锁,并等待调用其中一个回调方法
  • 将同步
    执行器的实例
    (仅立即调用
    .run()
    的实例)传递给
    RestAdapter.Builder上的
    setExecutors
    ,以便后台调用和回调调用同步发生

有关改装2,请参见此处的答案:您可以将同步执行器提供给OkHttpClient(通过其调度程序),并将此客户端设置为Reformation.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实现的示例:

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

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

请参见

在执行服务器.play()之前是否需要附加回调?当我更改订单时,会引发异常java.lang.IllegalStateException:调用play()之前无法检索端口+1谢谢,提供同步
执行器
效果很好。锁不会阻塞主线程,因此不允许回调(在主线程上)执行,因此锁永远不会释放吗?通过“锁定”,我想到了类似于
倒计时闩锁的东西
这不适用于改装2。如何使其在改装2中工作?
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("""{}""")
    }

)