Android Volley - асинхронное тестирование - PullRequest
0 голосов
/ 22 января 2019

Я использую библиотеку Volley для выполнения HTTP-запросов.

Я хочу сделать тест, в котором я заглушаю HTTP-ответ с помощью WireMock. Часть заглушки WireMock не является проблемой, но я не могу придумать решение, которое позволило бы мне дождаться завершения запроса асинхронного залпа.

@Test
public void callOnSuccessWhenGoodResponse()
{
    // WireMock stubbing...

    myVolleyClass.signup(infos, mockedCallback); // Async operation

    // Have to wait here for the async operation to finish

    Mockito.verify(mockedCallback).onSuccess(token);
}

Как ждать завершения асинхронной операции?

Я пробовал с CountDownLatch вот так:

@Test
public void callOnSuccessWhenGoodResponse()
{
    CountDownLatch latch = new CountDownLatch(1);

    MyCallback callback = new MyCallBack()
    {
        @Override
        void onSuccess()
        {
            latch.countDown();
        }

        void onError()
        {
            fail("Expected onSuccess but got onError");
        }
    };

    // WireMock stubbing...

    myVolleyClass.signup(infos, callback); // Async operation

    latch.await(3, TimeUnit.SECONDS);

    assertEquals(0, latch.getCount());
}

но await() блокирует текущий поток, и Volley выполняет обратный вызов, который мы передаем ему в потоке пользовательского интерфейса, который, я думаю, будет потоком, в котором выполняется тест. Так что countdown() никогда не выполнится вовремя.

Лучшим решением было бы сделать так, чтобы Воллей делал свои запросы синхронно во время этого теста, но я не знаю, возможно ли это и что подделать. Есть намеки?

...