Java 在测试中模拟CompletionException

Java 在测试中模拟CompletionException,java,exception,mockito,completable-future,Java,Exception,Mockito,Completable Future,我有一个类HttpClient,它的函数返回CompletableFuture: public class HttpClient { public static CompletableFuture<int> getSize() { CompletableFuture<int> future = ClientHelper.getResults() .thenApply((searchResults) -> {

我有一个类
HttpClient
,它的函数返回
CompletableFuture

public class HttpClient {

  public static CompletableFuture<int> getSize() {
      CompletableFuture<int> future = ClientHelper.getResults()
                 .thenApply((searchResults) -> {
                    return searchResults.size();
                });

      return future;
   }
}
现在,我想编写一个测试来模拟
ClientHelper.getResults
失败的情况,为此我编写了以下代码:

@Test
public void myTest() {
    HttpClient mockClient = mock(HttpClient.class);

    try {
        Mockito.doThrow(new CompletionException(new Exception("HTTP call failed")))
                .when(mockClient)
                .getSize();

        Caller.caller();

    } catch (Exception e) {
        Assert.fail("Caller should not have thrown an exception!");
    }
}
这个测试失败了。
中的代码异常地
从不执行。但是,如果我正常运行源代码,并且HTTP调用确实失败,那么它将进入
异常


我必须如何编写测试,才能执行
异常的
代码?

我通过在测试中这样做来实现这一点:

CompletableFuture<Long> future = new CompletableFuture<>();
future.completeExceptionally(new Exception("HTTP call failed!"));

Mockito.when(mockClient.getSize())
        .thenReturn(future);
CompletableFuture=newcompletablefuture();
future.completeeexceptionaly(新异常(“HTTP调用失败!”);
Mockito.when(mockClient.getSize())
.然后返回(未来);

不确定这是否是最好的方法。

我认为这是最好的方法:CompletableFuture是一个广泛使用且经过良好测试的库,因此您可以依靠它来测试代码,而不是尝试使用Mockito复制其行为。(当然,Mockito是一种很好的方式,可以在您模拟的测试依赖项下为您的系统提供未来。)
CompletableFuture<Long> future = new CompletableFuture<>();
future.completeExceptionally(new Exception("HTTP call failed!"));

Mockito.when(mockClient.getSize())
        .thenReturn(future);