Mockito如何无需逐个编写any()对多参数方法执行stub操作
Mockito多参数Stub简化方案
可以实现你要的简写效果,Mockito本身没有内置完全通用的anyNumberOfArgument()匹配器,但可以通过以下两种常用方案达成目标,不需要逐个手写6个any()参数:
方案1:自定义工具方法(全Mockito版本适用,适配固定参数数量的方法)
你可以自行封装一个简易工具类,通过反射自动匹配方法参数数量生成对应的any()匹配器,示例实现如下:
import static org.mockito.ArgumentMatchers.any; import org.mockito.Mockito; import java.lang.reflect.Method; public class MockitoStubUtils { @SuppressWarnings("unchecked") public static <T> void stubMethodWithAnyParams(T mock, String methodName, Object returnVal) throws Exception { // 匹配对应方法名的第一个方法(如有重载可补充参数类型判断逻辑) Method targetMethod = null; for (Method m : mock.getClass().getDeclaredMethods()) { if (m.getName().equals(methodName)) { targetMethod = m; break; } } // 按参数数量批量生成any()匹配器 Object[] matchers = new Object[targetMethod.getParameterCount()]; for (int i = 0; i < matchers.length; i++) { matchers[i] = any(); } // 执行stub操作 Mockito.when(targetMethod.invoke(mock, matchers)).thenReturn(returnVal); } }
使用时仅需一行代码即可完成 stub:
MockitoStubUtils.stubMethodWithAnyParams(service, "method", new ArrayList<>());
方案2:内置匹配器(仅适用于可变参数方法)
如果你的service.method本身是可变参数定义的(如List method(Object... params)),直接使用Mockito内置的anyVararg()匹配器即可:
when(service.method(anyVararg())).thenReturn(new ArrayList<>());
该匹配器从Mockito 1.9.5版本开始提供,专门用于匹配可变参数方法的任意个数参数调用。
补充开发技巧
如果你使用IntelliJ IDEA,可直接输入method(any6后触发自动补全,IDE会自动生成6个any()参数,无需手动逐个输入,开发效率也很高。
内容的提问来源于stack exchange,提问作者loser8
相关产品推荐
相关产品推荐

