使用Mockito模拟KinesisAsyncClient时遭遇thenReturn方法不匹配错误求助
问题根源
你错误地尝试直接mock链式调用kinesisClient.putRecord(any()).get(),Mockito无法直接处理这种跨对象的链式调用逻辑。KinesisAsyncClient.putRecord()返回的是CompletableFuture<PutRecordResult>,你需要先mock这个Future对象,再指定它的get()方法返回预期结果。
正确实现方式
步骤说明
- Mock
KinesisAsyncClient实例 - 准备好要返回的
PutRecordResult(可以是真实实例或mock对象) - 创建一个已完成的CompletableFuture,将
PutRecordResult作为结果传入 - 配置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
相关产品推荐
相关产品推荐

