如何用Mockito mock方法返回传入的最后一个ArrayList类型参数
正确实现方案
错误原因分析
- 方案1失效是因为对Spy对象直接使用
when(spied.method()).then()语法时,会先执行方法的真实逻辑,如果真实逻辑有依赖缺失、副作用就会导致打桩不生效,Spy对象优先推荐使用doXxx系列方法打桩。 - 方案2报错是因为
doReturn()需要传入方法实际返回的具体值,而AdditionalAnswers.returnsLastArg()是Answer接口的实现类,不是目标方法要求返回的List类型,因此出现类型不匹配错误。
正确代码
使用doAnswer替换doReturn即可,doAnswer专门用于接收Answer类型的动态返回逻辑:
// 方案A:直接使用AdditionalAnswers工具类 Mockito.doAnswer(AdditionalAnswers.returnsLastArg()) .when(spied) .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(), Mockito.anyList());
如果不想依赖AdditionalAnswers,也可以手动实现Answer逻辑:
// 方案B:手动实现Answer逻辑 Mockito.doAnswer(invocation -> invocation.getArgument(2)) .when(spied) .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(), Mockito.anyList());
内容的提问来源于stack exchange,提问作者Scientist
相关产品推荐
相关产品推荐

