@Test
public void refreshesAsynchronously() throws Throwable {

  // Initial load
  var initialValue = sut.get();
  assertThat(initialValue, is(INITIAL_VALUE));
  verify(delegate).get();
  // Set up reload to block
  var reloadFuture = new CompletableFuture<Integer>();
  when(delegate.get()).then(a -> reloadFuture.join());
  // Progress time enough to exceed timeout
  now = now.plus(TIMEOUT).plusSeconds(1);
  // Trigger refresh - should return old value and not block
  var triggerValue = sut.get();
  assertThat(triggerValue, is(INITIAL_VALUE));
  // Wait for refresh
  await().until(() -> Try.of(() -> verify(delegate, times(2)).get()).isSuccess());
  // Complete reload
  reloadFuture.complete(NEW_VALUE);
  // Eventually observe new value
  await().until(() -> sut.get() == NEW_VALUE);
}