You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockito模拟KinesisAsyncClient时遭遇thenReturn方法不匹配错误求助

问题根源

你错误地尝试直接mock链式调用kinesisClient.putRecord(any()).get(),Mockito无法直接处理这种跨对象的链式调用逻辑。KinesisAsyncClient.putRecord()返回的是CompletableFuture<PutRecordResult>,你需要先mock这个Future对象,再指定它的get()方法返回预期结果。

正确实现方式

步骤说明

  1. Mock KinesisAsyncClient实例
  2. 准备好要返回的PutRecordResult(可以是真实实例或mock对象)
  3. 创建一个已完成的CompletableFuture,将PutRecordResult作为结果传入
  4. 配置mock的kinesisClient.putRecord()方法返回这个已完成的Future

代码示例

方式1:使用真实的PutRecordResult实例

// Mock KinesisAsyncClient
KinesisAsyncClient kinesisClient = mock(KinesisAsyncClient.class);

// 构造真实的PutRecordResult并设置属性
PutRecordResult res = new PutRecordResult();
res.setShardId("shard-12345");

// 创建已完成的Future,封装结果
CompletableFuture<PutRecordResult> completedFuture = CompletableFuture.completedFuture(res);

// 配置mock:当调用putRecord时返回这个Future
when(kinesisClient.putRecord(any(PutRecordRequest.class))).thenReturn(completedFuture);

方式2:使用Mock的PutRecordResult

KinesisAsyncClient kinesisClient = mock(KinesisAsyncClient.class);
PutRecordResult res = mock(PutRecordResult.class);
when(res.getShardId()).thenReturn("shard-12345");

CompletableFuture<PutRecordResult> completedFuture = CompletableFuture.completedFuture(res);
when(kinesisClient.putRecord(any(PutRecordRequest.class))).thenReturn(completedFuture);

为什么原代码报错

原代码中when(kinesisClient.putRecord(any()).get())的写法是错误的:Mockito无法识别你要mock的是putRecord返回的Future的get()方法,它会尝试解析整个表达式的返回类型,但由于没有先mock Future对象,导致类型匹配失败,最终抛出no suitable method found for thenReturn(PutRecordResult)的错误。

内容的提问来源于stack exchange,提问作者lakshmiravali rimmalapudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:30:18