Я использую библиотеку 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()
никогда не выполнится вовремя.
Лучшим решением было бы сделать так, чтобы Воллей делал свои запросы синхронно во время этого теста, но я не знаю, возможно ли это и что подделать. Есть намеки?