UnitTest CompletableFuture in Java - PullRequest
       29

UnitTest CompletableFuture in Java

1 голос
/ 31 марта 2020

Мне нужно протестировать методы цепочки 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 поведения метода цепочки?

Любая помощь, улучшения будут полезны. Спасибо!

...