@Override
  public <T> AsyncResult<T> startProcess(Callable<T> task) {
    return startProcess(task, null);
  }
@Test
  void testSuccessfulTaskWithCallback() {
    assertTimeout(ofMillis(3000), () -> {
      // Instantiate a new executor and start a new 'null' task ...
      final var executor = new ThreadAsyncExecutor();

      final var result = new Object();
      when(task.call()).thenReturn(result);

      final var asyncResult = executor.startProcess(task, callback);
      assertNotNull(asyncResult);
      asyncResult.await(); // Prevent timing issues, and wait until the result is available
      assertTrue(asyncResult.isCompleted());

      // Our task should only execute once ...
      verify(task, times(1)).call();

      // ... same for the callback, we expect our object
      verify(callback, times(1)).onComplete(eq(result));
      verify(callback, times(0)).onError(exceptionCaptor.capture());

      // ... and the result should be exactly the same object
      assertSame(result, asyncResult.getValue());
    });
  }