如何在Mockito中正确匹配varargs

2022-08-31 06:45:57

我一直在尝试使用Mockito来模拟一个带有vararg参数的方法:

interface A {
  B b(int x, int y, C... c);
}

A a = mock(A.class);
B b = mock(B.class);

when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));

这不起作用,但是如果我这样做:

when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));

这是有效的,尽管我在存根方法时完全省略了varargs参数。

有什么线索吗?


答案 1

Mockito 1.8.1 引入了 anyVararg() 匹配器

when(a.b(anyInt(), anyInt(), Matchers.<String>anyVararg())).thenReturn(b);

另请参阅历史记录:https://code.google.com/archive/p/mockito/issues/62

用后编辑新语法:

when(a.b(anyInt(), anyInt(), ArgumentMatchers.<String>any())).thenReturn(b);

答案 2

一个有点未记录的功能:如果你想开发一个匹配vararg参数的自定义匹配器,你需要实现它才能正常工作。这是一个空的标记接口,没有它,Mockito在使用 Matcher 调用带有 varargs 的方法时将无法正确比较参数。org.mockito.internal.matchers.VarargMatcher

例如:

class MyVarargMatcher extends ArgumentMatcher<C[]> implements VarargMatcher {
    @Override public boolean matches(Object varargArgument) {
        return /* does it match? */ true;
    }
}

when(a.b(anyInt(), anyInt(), argThat(new MyVarargMatcher()))).thenReturn(b);