在espresso测试中使用MockWebServer的调度程序来响应来自另一个模块的Async调用

时间:2018-06-22 08:04:23

标签: android android-espresso mockwebserver

我正在为一个应用程序编写UI测试,该应用程序期望JSON负载作为对通过异步调用发出的请求的响应而传递,该请求由我正在测试的活动中的按钮触发。我打算提供各种模拟有效负载来设置此活动的状态并在UI中声明各种项目。

我不能让调度程序捕获通过异步调用发出的请求。

异步调用是在模块中的类中进行的,这是我的应用程序的编译时依赖性,我觉得这就是我的问题所在,甚至不确定这是否超出Espresso的能力范围。 / p>

@Before
public void setup() throws Exception {
    server = new MockWebServer();
    server.start();
    // setting API in my production code to the MockWebServer 
    settingsProvider.setWebServiceURL(server.url("/").toString());

    server.setDispatcher(new Dispatcher() {
        @Override
        public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {

            if (recordedRequest.getPath().startsWith("/v1/customers")) {

                return new MockResponse().setResponseCode(200).setBody(JSONstring);
            }
            return new MockResponse().setResponseCode(204);
        }
    });
    }

如果我在实际测试中提出了测试请求,则该请求有效:

@Before
    public void testGet(){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(server.url("/v1/customers").toString()).build();
        Log.d(LOG_TAG, "Test send GET " + request);

        try {
            Response response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

通过添加日志,我已经验证我的API URL设置正确,并且与MockWebServer处于同一端口。该应用程序当前未使用任何依赖项注入。

异步调用的主要部分:

    public void makeAsyncCall(final Application ctx , final AsyncWebServiceRequest request, final ResponseListenerInterface rli){

    final AsyncWebServiceResponseListener listener = new AsyncWebServiceResponseListener(ctx, request, rli);

    IntentFilter responseIntent = new IntentFilter(CommsActions.SEND);
    responseIntent.addCategory(request.getMessageType());
    ctx.registerReceiver(listener, responseIntent);

    try {
               ctx.startService(intent);
    } catch (Exception e) {
        Log.e(LOG_TAG , Log.getStackTraceString(e));
        );
    }
}

赞赏任何输入。

1 个答案:

答案 0 :(得分:0)

长话短说-我没有意识到我实际上是在尝试模拟AMQP通话,菜鸟动作。

幸运的是,我能够通过使用改造将它们转换为HTTP请求,从而简化了代码,因为该应用程序只真正需要通过AMQP发送数据,而检索可以是一个简单的HTTP GET,因此可以轻松实现模拟Web服务器并实际上加快了请求。