argThat加上
这就是你验证论证失败的原因:
verify(mock).mymethod(argThat(
x -> false ));
在哪里
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
argThat +断言
上面的测试将“说”Expected: lambda$…是: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,对其他有效调用则返回false(没有断言异常)。这种期望对于一个方法调用来说不是问题——它应该只返回true一次。
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
现在失败的测试会说:Expected: Obj.description包含'KEY'。是:“实际描述”。注意:我使用了assertJ断言,但是使用哪个断言框架取决于您。
直接的观点
Mokito使用equals()比较直接参数:
verify(mock).mymethod(expectedArg);
// NOTE: ^ where the parentheses must be closed.
情商匹配器
不要对单个参数使用eq。使用前面提到的直接论证。
Mokito使用equals()比较直接参数
原因:eq将是SonarQube / sonarcloud违反:https://rules.sonarsource.com/java/tag/mockito/RSPEC-6068
有多个参数。
如果你使用argThat,所有的参数都必须匹配。例如,在不同的情况下,如果你有另一个带有2个参数的方法:
verify(mock).mymethod2(eq("VALUE_1"), argThat((x)->false));
// above is correct as eq() is also an argument matcher.
验证(模拟)。mymethod2(“VALUE_1 argThat ((x) - > false));
//以上不正确;将抛出一个异常,如第一个参数。没有参数匹配器。
地点:
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
最初问题失败的根本原因是括号放错了位置:
验证(mock.mymethod…这是错误的。右边是:
验证(模拟)。*