argThat
加拉姆达
这就是您无法通过论证验证的方式:
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 次以上,但验证者始终匹配(返回
true
)。
如果验证的方法调用了 2 次以上,mockito 会将所有调用的组合传递给每个验证者。因此,mockito 期望您的验证器静默返回true
参数 set 之一,并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
有多个参数。
如果使用argThat
,则必须为所有参数提供匹配项。例如,如果在另一种情况下,您有另一个带有 2 个参数的方法:
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).*