argThat
加上λ
这就是你如何失败你的参数验证:
verify(mock).mymethod(argThat(
x -> false ));
哪里
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat
加断言
上面的测试会“说”。如果在 lambda 中使用断言,则可以获取更具体的失败原因:Expected: lambda$... Was: YourClass.toSting...
verify(mock).mymethod(argThat( x -> {
assertThat(x).isNotNull();
assertThat(x.description).contains("KEY");
return true;
}));
❗️但是❗️:这仅适用于以下情况
- 呼叫应为 1 次,或者
- 调用应为 2 次以上,但验证程序的所有次数都匹配(返回
true
)。
如果验证的方法调用了 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
直接参数
Mokito使用以下方法比较直接参数:equals()
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
eq
匹配器
argThat
具有多个参数。
如果使用 ,则必须为所有参数提供匹配项。例如,如果在另一种情况下,您有另一个具有2个参数的方法:argThat
verify(mock).mymethod2(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
verify(mock).mymethod2("VALUE_1", argThat((x)->false));
// above is incorrect; an exception will be thrown, as the first 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;
原始问题失败的根本原因是括号中的错误位置:
-
verify(mock.mymethod...
.这是错误的。右边是:
verify(mock).*