@Test public void shouldConvertFailureToFailedCompletableFuture() { final CompletableFuture<Object> future = failure().toCompletableFuture(); assertThat(future.isDone()); assertThat(future.isCompletedExceptionally()); assertThatThrownBy(future::get) .isExactlyInstanceOf(ExecutionException.class) .hasCauseExactlyInstanceOf(RuntimeException.class); }
@Test public void shouldAbortWhenTargetFutureWantsToAbort() throws Exception { // given final RetryExecutor executor = new AsyncRetryExecutor(schedulerMock); given(serviceMock.safeAsync()).willReturn(failedAsync(new AbortRetryException())); // when final CompletableFuture<String> future = executor.getFutureWithRetry(ctx -> serviceMock.safeAsync()); // then assertThat(future.isCompletedExceptionally()).isTrue(); try { future.get(); failBecauseExceptionWasNotThrown(ExecutionException.class); } catch (ExecutionException e) { final Throwable cause = e.getCause(); assertThat(cause).isInstanceOf(AbortRetryException.class); } }
@Test public void shouldRethrowOriginalExceptionFromUserFutureCompletion() throws Exception { // given final RetryExecutor executor = new AsyncRetryExecutor(schedulerMock).abortOn(SocketException.class); given(serviceMock.safeAsync()).willReturn(failedAsync(new SocketException(DON_T_PANIC))); // when final CompletableFuture<String> future = executor.getFutureWithRetry(ctx -> serviceMock.safeAsync()); // then assertThat(future.isCompletedExceptionally()).isTrue(); try { future.get(); failBecauseExceptionWasNotThrown(ExecutionException.class); } catch (ExecutionException e) { final Throwable cause = e.getCause(); assertThat(cause).isInstanceOf(SocketException.class); assertThat(cause).hasMessage(DON_T_PANIC); } }
@Test public void shouldRethrowExceptionThatWasThrownFromUserTaskBeforeReturningFuture() throws Exception { // given final RetryExecutor executor = new AsyncRetryExecutor(schedulerMock).abortOn(IllegalArgumentException.class); given(serviceMock.safeAsync()).willThrow(new IllegalArgumentException(DON_T_PANIC)); // when final CompletableFuture<String> future = executor.getFutureWithRetry(ctx -> serviceMock.safeAsync()); // then assertThat(future.isCompletedExceptionally()).isTrue(); try { future.get(); Assertions.failBecauseExceptionWasNotThrown(ExecutionException.class); } catch (ExecutionException e) { assertThat(e.getCause()).isInstanceOf(IllegalArgumentException.class); assertThat(e.getCause()).hasMessage(DON_T_PANIC); } }