首页 > 解决方案 > 如何使用 Mockito 测试 CompletableFuture 类的 handle() 方法?

问题描述

我有以下代码:

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>对象,然后将其馈送到句柄函数中。现在我正在尝试模拟sesAsyncClient对象,以便我可以在不实际调用服务的情况下测试它的功能。

我写了以下模拟语句

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

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

谢谢

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

没有覆盖 lambda 函数

标签: javaunit-testingmockitoamazon-sescompletable-future

解决方案


推荐阅读