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

使用ArgumentCaptor时,如何优雅忽略不同类型双参函数的某一参数?

问题

我找到的所有ArgumentCaptor示例都只覆盖两种场景:要么是函数只有1个参数,要么是函数有2个及以上同类型参数。但如果函数包含两个不同类型的参数呢?我就碰到了这样的函数:

// (在类型为FooSender的@MockBean中)
public void send(Message message, SessionID session)

我目前想到的最优解法是这样的:

// 我需要的捕获器
ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);

// 我不关心sessionID参数,但验证调用时必须传这个捕获器
ArgumentCaptor<SessionID> sessionIdCaptor = ArgumentCaptor.forClass(SessionID.class);

Mockito.verify(fooSender).send(messageCaptor.capture(), sessionIdCaptor.capture());
                                                        // ^^^^^ 完全不需要关注这个!

// 我只会对messageCaptor做断言,之后再也不会用到sessionIdCaptor

有没有办法不用构造sessionIdCaptor就能实现需求?

解决方案

当然可以,你可以用Mockito的任意参数匹配器替代无关参数的捕获器,无需创建多余的ArgumentCaptor。

修改后的代码如下:

ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);

// 用指定类型的任意匹配器匹配第二个参数
Mockito.verify(fooSender).send(messageCaptor.capture(), any(SessionID.class));

// 后续正常对messageCaptor执行断言逻辑即可

如果不需要严格指定参数类型,使用any()也能达到效果,但更推荐any(SessionID.class),这样代码语义更清晰,明确表示我们要匹配的是SessionID类型的任意参数。

这种方式既满足了捕获目标参数的需求,又简化了代码结构,避免了不必要的对象创建。


内容的提问来源于stack exchange,提问作者Grant Birchmeier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:02:09