argThat
加lambda
这就是您无法通过参数验证的方法:
verify(mock).mymethod(argThat(
(x)->false
));
哪里
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
加断言
以上测试将“说” Expected: lambda$... Was: YourClass.toSting...
。如果在lambda中使用断言,则可以得到更具体的失败原因:
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
但是:这仅适用于1方法调用。如果经过验证的方法调用了2次以上,则Mockito将所有调用的组合传递给每个验证程序。因此,mockito期望您的验证程序以静默方式返回true
其中一个参数集,并false
(无断言异常)返回其他有效调用。期望对于1个方法调用来说不是问题-它应该只返回true 1次。
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
现在测试说:Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
。注意:我使用了assertJ
断言,但是要取决于您使用哪个断言框架。
argThat
有多个参数。
如果使用argThat
,则必须为所有参数提供匹配项。例如:
verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod("VALUE_1", argThat((x)->false));
// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.
哪里:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
eq
匹配器
检查参数是否相等的最简单方法:
verify(mock).mymethod(eq(expectedValue));
// NOTE: ^ where the parentheses must be closed.
直接论证
如果通过ref比较是可以接受的,则继续:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
原始问题失败的根本原因是括号中的错误位置:verify(mock.mymethod...
。错了 正确的是:verify(mock).*