Mockito 5.8.0 可变参数匹配歧义问题咨询
解决Mockito可变参数方法的全场景匹配问题
确实存在能覆盖所有调用场景的统一语法,核心是通过自定义参数匹配器结合ArgumentMatchers.argThat(),兼容可变参数的各类输入情况:
统一匹配方案
我们可以编写一个匹配器,同时适配以下所有调用场景:
myMock.foo()myMock.foo("hello")myMock.foo("hello", "there")myMock.foo((String[]) null)
具体配置代码如下:
Mockito.when(myMock.foo(ArgumentMatchers.argThat(argument -> argument == null || argument instanceof String[] ))).thenReturn(Long.valueOf(1));
如果需要更严谨的类型校验,可明确匹配数组类型:
Matcher<String[]> varargsMatcher = argument -> argument == null || argument.getClass() == String[].class; Mockito.when(myMock.foo(ArgumentMatchers.argThat(varargsMatcher))) .thenReturn(Long.valueOf(1));
原有匹配器的局限原因
any(String[].class):Mockito会严格匹配非null的String[]类型,但显式传入的null数组会被判定为不匹配,因为any(Class)要求参数类型匹配且不为null。nullable(String[].class):由于可变参数的语法糖特性,传入单个字符串(如foo("Hello"))时Java会自动包装成String[],但Mockito的nullable匹配器此时会将参数视为Object类型而非String[],导致类型不匹配。
验证所有场景
配置完成后,以下调用都会正确返回1:
myMock.foo()→ 底层传入空String[],匹配器判定通过myMock.foo("hello")→ 自动包装为String[],匹配器判定通过myMock.foo("hello", "there")→ 自动包装为String[],匹配器判定通过myMock.foo((String[]) null)→ null数组,匹配器判定通过
内容的提问来源于stack exchange,提问作者MeBigFatGuy
相关产品推荐
相关产品推荐

