Мне нужно протестировать методы цепочки CompletableFuture, настройка выглядит следующим образом:
private final ScheduledExecutorService schedulerService = Executors.newSingleThreadScheduledExecutor();
@Override
public void interfaceMethod(Param1 p1, Param2 p2) {
actionSetup(Param1 p1, Param2 p2);
}
// calls firstMethod if gets value calls secondMethod else calls itself till completes
// firstMethod returns Double, secondMethod is void
protected Void actionSetup(Param1 p1, Param2 p2) {
ScheduledFuture<?> schedule = schedulerService.schedule(() -> firstMethod(Param p1, Param2 p2));
CompletableFuture.supplyAsync(() -> {
Double result = null;
try {
result = (Double) schedule.get();
} catch (Exception e) {
actionSetup(Param1 p1, Param2 p2);
}
return result;
}).thenAccept(returnedValue -> secondMethod(Param p1, Param p2))
.exceptionally(t -> actionSetup(Param1 p1, Param2 p2));
return null;
}
У меня мало опыта с CompletableFuture
, но я достиг того, что планировал. Я начал писать тесты для этого метода и изо всех сил пытался проверить, что если firstMethod
возвращает не null
, то вызовы secondMethod
ИЛИ возвращают ноль и вызовы actionSetup
. Тест написан до сих пор:
@Autowired
TargetService ts;
...
@Test
public void testActionSetup() {
MockService ms = Mockito.spy(ts);
ms.actionSetup(Param1 p1, Param2 p2); // forced to return null
Mockito.verify(spyDeliveryService, Mockito.times(2)); // this is noncompliant
Mockito.verify(ms, Mockito.times(1)).firstMethod(Param1 p1, Param2 p2);
// says 'However, there were other interactions with this mock:
// ts.secondMethod(Param p1, Param p2) was called too
}
Использование там Void
, чтобы я мог использовать его в exceptionally
.
Есть ли способ Mockito.verify
несколько вызовов без одновременного без Mockito.times(2)
? Не могли бы вы предоставить другие способы проверки этого? Или есть другие способы тестирования CompletableFuture
поведения метода цепочки?
Любая помощь, улучшения будут полезны. Спасибо!