Доброе утро,
Я не совсем знаком с CompletableFutures (я опытный разработчик, но я не нахожу их особенно интуитивными!).
Учитывая следующий фрагмент :
public CompletionStage<Void> leaveGame(GameService gameService)
{
return gameService.deregister(playerName)
.exceptionally(t -> {
LOGGER.info("Could not deregister: {}", t.getMessage());
throw new CompletionException(t);
});
}
, который вызывается модульным тестом:
@Test
public void shouldCompleteExceptionallyForFailedLeave()
{
var failFlow = new CompletableFuture<Void>();
failFlow.completeExceptionally(new Exception("TestNonExistentPlayer"));
when(mockedGameService.deregister(any(String.class))).thenReturn(failFlow);
try
{
player.leaveGame(mockedGameService).toCompletableFuture().get();
fail("Exception should have been thrown");
}
catch (Exception e)
{
assertEquals(Exception.class, e.getCause().getClass());
}
verify(mockedGameService, times(1)).deregister(any(String.class));
}
, который высмеивает gameService.deregister(...)
для завершения исключения и возврата Exception
.
В вышеупомянутом случае как и ожидалось, запускается исключительно ветвь, сообщение регистрируется, и исключение в модульном тесте перехватывается, т. е. утверждение fail(...)
не срабатывает.
Однако, когда я хочу запустить CompletionStage перед выходом из игры, например:
public CompletionStage<Void> leaveGame(GameService gameService)
{
return CompletableFuture.runAsync(() -> System.out.println("BLAH"))
.thenRun(() -> gameService.deregister(playerName)
.exceptionally(t -> {
LOGGER.info("Could not deregister: {}", t.getMessage());
throw new CompletionException(t);
}));
}
Исключительно ветвь является все еще сработала, но исключение теперь не перехватывается тестовым методом, то есть утверждение fail(...)
является сработало.
Что я делаю не так?
Заранее большое спасибо!