使用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
相关产品推荐
相关产品推荐

