title: Junit : How to cover CompletableFuture Code
body: <p>I am new to Junit and come across this problem recently. I am not able code write test cases wherever I used CompletableFuture in my code. Like below Java file </p>
  
  <p><strong>Updated</strong></p>
  
  <p><strong>AuditService.java</strong></p>
  
  <pre><code>@Autowired
  Executor existingThreadPool;
  
  @Override
  public void auditData(List&lt;ErrorDetails&gt; alertList) {
      CompletableFuture.runAsync(() -&gt; {
          if (alertList.isEmpty())
              //privateMethodCall1
          else
             //privateMethodCall2
      }, existingThreadPool);
  }
  </code></pre>
  
  <p>I followed this <a href="https://stackoverflow.com/questions/631598/how-to-use-junit-to-test-asynchronous-processes">link</a> and tried below solution still getting NPE for CompletableFuture Like below error.</p>
  
  <p><strong>AuditServiceTest.java</strong></p>
  
  <pre><code>@InjectMock
  AuditService auditService;
  
  @Mock
  private CompletableFuture&lt;Void&gt; completableFuture = null;
  
  @Before
  public void setup() {
      MockitoAnnotations.initMocks(this);
      completableFuture = CompletableFuture.runAsync(new Runnable() {
          @Override
          public void run() {}
      },Executors.newSingleThreadExecutor());
  }
  
  @Test
  public void shouldAuditData() {
      List&lt;ErrorDetails&gt; alertList = new ArrayList();
      auditService.auditData(alertList);
  }
  </code></pre>
  
  <p><strong>ERROR</strong></p>
  
  <pre><code>java.lang.NullPointerException
      at java.util.concurrent.CompletableFuture.screenExecutor(CompletableFuture.java:415)
      at java.util.concurrent.CompletableFuture.runAsync(CompletableFuture.java:1858)
      at com.service.impl.AuditService.auditData(AuditService.java:15)
      at com.service.impl.AuditServiceTest.shouldAuditData(AuditServiceTest.java:249)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
  </code></pre>