public @NonNull ThrowableSubject hasFailureThat() {
        this.result().isEmpty();
        this.failure().isPresent();
        try {
            this.actual.join();
            this.failWithActual(Fact.simpleFact("expected future to throw on join()"));
            throw new IllegalStateException();
        } catch (final CompletionException e) {
            return this.check("cause of CompletionException thrown by join()").that(e.getCause());
        }
    }
Subject for assertions about completable futures. Futures are join()ed to get
results or exceptions, and {@link CompletionException}'s cause is unwrapped to
{@link #failure()}. Any other exceptions thrown by join() are unexpected failures.
This class also does not properly handle futures where null is a successful result.

@param <T> future result type
cloud-core/src/test/java/org/incendo/cloud/truth/CompletableFutureSubject.java