更新后的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);
}
}
答案 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长度匹配),但至少它对顺序不敏感...