首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MockWebServer与回调重组

MockWebServer与回调重组
EN

Stack Overflow用户
提问于 2014-06-30 12:11:42
回答 3查看 5.7K关注 0票数 12

我想用MockWebServer来模拟网络通信。不可修改的回调永远不会被调用。我的代码:

代码语言:javascript
复制
    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();

当我使用不需要回调的改装时,它可以工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-30 16:23:22

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

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

  • 在测试结束时使用一个锁,直到调用其中一个回调方法。
  • 将同步Executor的一个实例(一个直接调用.run()的实例)传递给RestAdapter.Builder上的setExecutors,以便后台调用和回调调用同步进行。
票数 14
EN

Stack Overflow用户

发布于 2018-07-09 04:28:35

关于改进2,请参见这里的答案:https://github.com/square/retrofit/issues/1259,您可以将同步执行器提供给OkHttpClient (通过它的dispatcher),并将这个客户机设置为Retrofit.Builder。还可以将相同的执行器设置为callbackExecutor。

例如:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2019-08-05 21:31:11

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

代码语言:javascript
复制
OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .mockinize(mocks) // <-- just add this line
        .build()

以及您想要模拟的请求/响应,可以在mocks值中定义。在你的例子中,它看起来是这样的:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24489882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档