Тестовый пример Mockito для CompletableFuture.runAsync (), который вызывает метод void - PullRequest
1 голос
/ 28 марта 2019

Мне нужна помощь, чтобы написать тестовый пример для следующего метода.

public void getCouponAndNotifyAsync(String countryId, String channelId,
        String storeNumber, String clientId, NotificationRequest notificationRequest)
        throws FirestoreException, TurneroServiceException {
    CompletableFuture.runAsync(() -> getCouponAndNotify(countryId, channelId,
            storeNumber, clientId, notificationRequest));
}

Где getCouponAndNotify () - метод void.

Пробовал ниже, но не работает

@Test
    public void getCouponAndNotifyAsync() throws Exception {
        //doNothing().when(turneroService).getCouponAndNotify(COUNTRYID, CHANNELID, STORENUMBER, CLIENTID, new NotificationRequest("ext_rborse@falabella.cl", "all"));

        CompletableFuture<Void> runAsync = CompletableFuture
                .runAsync(() -> doNothing().when(turneroService).getCouponAndNotify(COUNTRYID, CHANNELID, STORENUMBER, CLIENTID, new NotificationRequest("ext_rborse@falabella.cl", "all")));

        assertTrue(runAsync.isDone());

    }

Обновлены тестовые случаи, но они все еще не работают.

@Test
    public void getCouponAndNotifyAsync() throws Exception {
        //doNothing().when(turneroService).getCouponAndNotify(COUNTRYID, CHANNELID, STORENUMBER, CLIENTID, new NotificationRequest("ext_rborse@falabella.cl", "all"));

        CompletableFuture<Void> runAsync = CompletableFuture
                .runAsync(() -> doNothing().when(turneroService).getCouponAndNotify(COUNTRYID, CHANNELID, STORENUMBER, CLIENTID, new NotificationRequest("ext_rborse@falabella.cl", "all")));

        assertTrue(ForkJoinPool.commonPool().awaitQuiescence(5, TimeUnit.SECONDS));
        assertTrue(runAsync.isDone());

    }

1 Ответ

1 голос
/ 28 марта 2019

Я предполагаю, что вы тестируете getCouponAndNotify() в другом месте, поэтому вам не нужно беспокоиться о том, что это вызовет исключение.

То, с чем вы столкнетесь, - это состояние гонки между getCouponAndNotifyAsync() и * 1005.* возвращение.Для этого есть несколько решений:

Поскольку вы используете общий ForkJoinPool, выполните

assertTrue(ForkJoinPool.commonPool().awaitQuiescence(5, TimeUnit.Seconds));

Он ожидает завершения задачи .

Кроме того, вы можете добавить ExecutorService и использовать его в качестве второго параметра для supplyAsync().У вас есть несколько вариантов: вы можете использовать макет, вы можете использовать ExecutorService, который работает с текущим потоком , или вы можете ввести стандартный Executors.newSingleThreadExecutor(), затем вызвать shutdown() и awaitTermination() в вашем тесте.

Вы также можете вернуть CompletionStage<Void> из getCouponAndNotifyAsync(), который можно подождать в тесте.

...