如何使用Mockito测试CompletableFuture类的handle()方法?

时间:2018-07-27 05:51:42

标签: java unit-testing mockito amazon-ses completable-future

我有以下代码:

SendEmailRequest request = getEmailMeta(toEmail, fromEmail, subject, htmlBody);
return sesAsyncClient.sendEmail(request)
    .handle((res, exp) -> {
        if (exp != null || res.messageId()==null || res.messageId().isEmpty()) {
            return false;
        }
        return true;
    });
}catch (Exception e){
    return CompletableFuture.completedFuture(false);
}

getEmailMeta()是一个辅助函数,它返回一个SendEmailRequest对象,并且工作正常。

类型为sesAsyncClient.sendEmail(request)

SESAsyncClient返回CompletableFuture<SendEmailResponse>对象,然后将其馈送到handle函数中。现在,我正在尝试模拟sesAsyncClient对象,以便可以在不实际调用服务的情况下测试其功能。

我写了下面的模仿语句

Mockito.when(sesAsyncClient.sendEmail(any(SendEmailRequest.class)))
.thenReturn(CompletableFuture.completedFuture(SendEmailResponse.builder().messageId(null).build()));

问题在于,控制流永远不会进入handle函数,而只会直接进入catch语句。关于如何评估手柄中的双功能有任何帮助吗?

谢谢

编辑: 假设我将fromEmail中的getEmailMeta字段作为""(空字符串)传递。第一行不会有任何错误,即构造SendEmailRequest对象。但是,当在下一行中将request输入到sendEmail不使用handle()时,我得到了一个错误SESAsyncClient: CompletionException: "From" field cannot remain empty,然后是{ {1}}语句捕获了这个异常。但是,如果有catch,那么除了输入参数之外,在handle()方法内的所有行上,覆盖工具中都看不到绿线。请参阅随附的屏幕截图。

No coverage on lambda function

0 个答案:

没有答案