如果您使用的是Mockito 2.1.0或更高版本以及Java 8或更高版本,请参阅此答案,现在它要简单得多。
我在写问题时找到了答案。
是的,可以。而不是使用你需要实现你自己的ArgumentMatcher<T>
实例,并使用Mockito#argThat(Matcher),
例如,假设我们要检查它是5...any(Bar.class)
i
// in the test (could also be outside)
private static final class BarIs5 extends ArgumentMatcher<Bar> {
@Override
public boolean matches(Object argument) {
return ((Bar) argument).getI() == 5;
}
}
然后像这样验证:verify(mockedFoo).doThing(argThat(new BarIs5()));
通过添加构造函数参数将其提升一个档次!
private static final class BarIsWhat extends ArgumentMatcher<Bar> {
private final int i;
public BarIsWhat(int i) {
this.i = i
}
@Override
public boolean matches(Object argument) {
return ((Bar) argument).getI() == i;
}
}
然后像这样验证:verify(mockedFoo).doThing(argThat(new BarIsWhat(5)));
更新:由于徽章,这在我的队列中弹出,并看到了一些改进的空间。
我已经尝试过这个,它的工作原理。你可以使用一个更干净的lambda表达式(至少如果你不介意未经检查的强制转换警告)。
唯一的问题是接受一个不是.幸运的是,Mockito's是一个抽象类,它扩展了它,只有一个抽象方法。argThat
Matcher
@FunctionalInterface
ArgumentMatcher
在你的测试(或一些常见的位置)做一个如下的方法
private static <T> ArgumentMatcher<T> matches(Predicate<T> predicate) {
return new ArgumentMatcher<T>() {
@SuppressWarnings("unchecked")
@Override
public boolean matches(Object argument) {
return predicate.test((T) argument);
}
};
}
现在,在您的测试中,您可以执行此操作以使用 lambda 表达式:
verify(mockedFoo).doThing(argThat(matches( (Bar arg) -> arg.getI() == 5 )));