Mockito模糊方法调用问题:RabbitTemplate Mock报错求解决方案
这个歧义问题我之前也碰到过,本质是Mockito没法确定你要mock的是RabbitTemplate里哪一个重载的convertAndSend方法。咱们一步步解决:
首先,先搞清楚为什么会报错:RabbitTemplate有多个convertAndSend的重载(比如带exchange/routingKey的三参数版本,或者只传消息+处理器的两参数版本)。当你用anyObject()作为第一个匹配器时,它能匹配几乎所有类型的参数,Mockito就懵了——它不知道你要匹配的是两参数的(Object, MessagePostProcessor),还是三参数里的第一个参数(比如String routingKey)加上后面的参数组合。
解决办法很直接,就是明确第一个参数的具体类型,把模糊的anyObject()替换成对应类型的any(XXX.class):
方案1:指定第一个参数的实际类型
假设你业务代码里传入的message是Spring AMQP的Message类型,那测试代码改成这样:
doNothing().when(rabbitTemplate).convertAndSend(any(Message.class), any(MessagePostProcessor.class));
如果message是字符串或者自定义的业务对象,就把Message.class换成对应的类型,比如String.class或者YourCustomMessage.class。
方案2:强制类型转换(适用于不确定类型或想兼容多种类型的场景)
如果不想限定死类型,也可以通过强制类型转换告诉Mockito参数的预期类型:
doNothing().when(rabbitTemplate).convertAndSend( (Object) any(), any(MessagePostProcessor.class) );
这种方式也能帮Mockito锁定到两参数的重载方法。
额外提示
尽量避免用anyObject(),Mockito现在更推荐用any()系列匹配器,类型更明确,也能减少这类歧义问题。
这样改完之后,Mockito就能精准找到你要mock的那个方法,歧义错误就消失啦。
内容的提问来源于stack exchange,提问作者Vitalii

