Использование диспетчера MockWebServer в тесте эспрессо для ответа на асинхронный вызов из другого модуля

Я пишу тесты пользовательского интерфейса для приложения, которое ожидает, что полезная нагрузка JSON будет доставлена ​​в ответ на запрос, сделанный с помощью асинхронного вызова, который запускается кнопкой в ​​тестируемом действии. Я намерен предоставить различные фиктивные полезные нагрузки, чтобы установить состояние этой активности и утвердить различные элементы в пользовательском интерфейсе.

Мне не повезло с тем, чтобы диспетчер перехватил запрос, сделанный через асинхронный вызов.

Асинхронный вызов выполняется в классе внутри модуля, который зависит от времени компиляции моего приложения, и я чувствую, что именно в этом заключается моя проблема, и я даже не уверен, выходит ли это за рамки возможностей Espresso.

@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();
        }

    }

Добавив журналы, я убедился, что мой URL-адрес API задан правильно и является тем же портом, что и 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));
        );
    }
}

Цените любой вклад.


person brybry    schedule 22.06.2018    source источник


Ответы (1)


Короче говоря, я не осознавал, что на самом деле пытался издеваться над призывом AMQP, ход новичка.

К счастью, мне удалось упростить код, преобразовав их в HTTP-запросы с помощью модификации, поскольку приложению действительно требуется только отправка данных, которая должна выполняться через AMQP, в то время как извлечение может быть простым HTTP GET, что позволило легко реализовать mockwebserver и фактически ускорило вверх запросы.

person brybry    schedule 30.10.2018