Как дождаться выполнение асинхронного метода?

237
05 июля 2022, 20:50

Как мне дождаться выполнение асинхронного метода? Есть такой метод Server.getData(DataListener listener); Данные загружаются в отдельном потоке, и по завершению передаются в DataListener. И все вроде бы хорошо, но я решил написать тесты к этому коду. Код JUnit Теста

@Test
    public void getDataTest(){
        Server.getData(new DataListener(){
            @Override
            onSuccess(String data){
                assertNotEquals(data,"");
            }
        });
    }

Тест будет пройден, не дожидаясь ответа от сервера и выполнение метода onSuccess(), как мне заблокировать метод Server.getData(), чтобы дождаться выполния onSuccess? Решение с execute() в Retrofit не подойдет

Answer 1

Нашел решение, достаточно просто использовать CountDownLatch

@Test
public void getDataTest(){
    CountDownLatch latch = new CountDownLatch(1);
    Server.getData(new DataListener(){
        @Override
        onSuccess(String data){
            assertNotEquals(data,"");
            latch.countDown();
        }
    });
    try {
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
READ ALSO
передача данных из одного окна в другое JavaFX

передача данных из одного окна в другое JavaFX

Здесь на странице регистрации я хочу передать допустим имя в следующее окно вот так:

164
redirect и вызов в чем отличие

redirect и вызов в чем отличие

В контроллере есть метод:

235
css waterfall (masonry) layout only css

css waterfall (masonry) layout only css

возникла необходимость создать сетку по типу "водопад", но самый первый элемент должен занимать две колонки (все остальные элементы...

340
Применение маски к box-shadow

Применение маски к box-shadow

У меня есть div с примененной к нему маскойЯ заметил, что я не могу применить box-shadow к тому же самому div, поэтому я должен переместить тень на wrapper...

273