Я узнаю о java 8 CompletableFuture
и закончил с этим.CompletedFuture удобство использования и модульный тест
Кулак всего, что вы думаете об этих строках кода? Мне нужно отправить запрос на разные службы параллельно, а затем дождаться ответа всех и продолжить работу.
//service A
CompletableFuture<ServiceAResponse> serviceAFuture = CompletableFuture.supplyAsync(
() -> this.ServiceA.retrieve(serviceARequest), serviceAExecutorService
);
//service B
CompletableFuture<ServiceBResponse> serviceBFuture = CompletableFuture.supplyAsync(
() -> this.ServiceB.retrieve(serviceBRequest), serviceBExecutorService
);
CompletableFuture.allOf(serviceAFuture, serviceBFuture).join();
ServiceAResponse responseA = serviceAFuture.join();
ServiceBResponse responseB = serviceBFuture.join();
И даже код делает то, что я хочу, у меня проблемы с тестированием класса, где этот код. Я попытался с помощью Mockito и сделать что-то вроде:
doAnswer(invocation -> CompletableFuture.completedFuture(this.serviceAResponse))
.when(this.serviceAExecutorService)
.execute(any());
Где исполнитель услуги и ответы услуги насмехается, но тест никогда не заканчивается и поток держит в ожидании чего-то в этой строке
CompletableFuture.allOf(serviceAFuture, serviceBFuture).join();
Любой намек на то, что Мне здесь не хватает? Спасибо!
Выполнение этого Я получаю NPE, потому что я должен издеваться над своим ExecutorService (я использую пользовательский), но если я использую выкромку, тест никогда не заканчивается. Конечно, если я использую службу исполнителя по умолчанию, не отправляя мой на CompletableFuture.supplyAsync(), он работает как шарм. – Leo
Ответ обновлен, пожалуйста, проверьте еще раз –
ДА! Спасибо! это то, что я должен делать всегда. Я хочу высмеять метод ExecutionService.execute()? Это именно то, что я пытался сделать, но так, как это работает. – Leo