如何匹配mockito 2中的varargs?

时间:2016-12-11 18:51:44

标签: mockito

更新后的mockito 1无法正常工作。

private class ArgumentsMatcher implements ArgumentMatcher<Object[]> {
    private final Object[] expected;

    private ArgumentsMatcher(Object[] expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object[] argument) {
        return Arrays.equals(expected, argument);
    }
}

4 个答案:

答案 0 :(得分:1)

Mockito 2中似乎不再支持此代码。代码的替代方法是:

// imagine this was expected
String[] expected = {"A", "B", "C"};

// and this was the method
void call(String ... varArgs);

// here's how you'd verify it
verify(someFunction).call(eq("A"), eq("B"), eq("C"));

// or
verify(someFunction).call(any());

答案 1 :(得分:1)

看起来不再需要VarargMatcher接口了。我在Scala项目中使用Mockito,看起来你可以创建自定义varargs匹配器,就像普通的自定义匹配器一样,但你只是将参数视为一个序列(不确定它是如何在Java中工作的,我怀疑你得到Array或者一个List)。

匹配器检查varargs是否包含某个元素的工作原理如下:

import org.mockito.ArgumentMatcher

case class IsVarargsContaining[T](expected: T) extends ArgumentMatcher[T] {

  override def matches(arg: T): Boolean =
    arg.isInstanceOf[Seq[T]] && arg.asInstanceOf[Seq[T]].contains(expected)

  override def toString() = s"<vararg list containing element $expected>"

}

答案 2 :(得分:1)

您可以使用捕获器来匹配它:

// Use an argument captor of whatever type the varargs method is
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
// Verify on the method using the captor
verify(fooClass).fooMethod(captor.capture());
// Assert on the expected values
assertEquals(captor.getAllValues(), Arrays.asList("vararg1", "vararg2"));

对此的好处是,您可以与数组匹配(如果您可以将数组和varargs混合使用),也可以使用所需的任何Hamcrest匹配器,以便执行诸如验证单个元素存在的操作,忽略顺序,忽略重复项或其他您需要做的事情。

答案 3 :(得分:0)

我使用的是Mockito 2.15,最后创建了一个自定义Matcher,它实现了org.mockito.ArgumentMatcher<T>,并采用了一组要匹配的值作为构造函数参数。

然后我将其传递: verify(someone).aMethods(argThat(matcher), argThat(matcher), etc.);

不太好(argThat()的调用次数必须与args长度匹配),但至少它对顺序不敏感...