以下是说明失败的测试。
class Parameter {
public int field;
Parameter(int init) {
field = init;
}
@Override
public boolean equals(Object o) {
return field == ((Parameter)o).field;
}
@Override
public String toString() {
return "Parameter{field=" + field + "}";
}
}
interface Method {
void method(Parameter parameter);
}
@Test
public void mockitoTest() {
Method mock = mock(Method.class, "mock");
Parameter parameter = new Parameter(0);
mock.method(parameter); // LINE 1
parameter.field++;
mock.method(parameter); // LINE 2
then(mock).should().method(new Parameter(1)); // LINE 3
}
它会产生以下错误。
org.mockito.exceptions.verification.TooManyActualInvocations:
mock.method(Parameter {field = 1});
想要1次:
->在第3行
但是是2次。意外调用:
->在第2行
现在,似乎发生的是,当 field 为0时,Mockito在LINE 1捕获了对 parameter 的引用。在下一行增加到1,并保持不变,直到发生验证的第3行为止。因此Mockito错误地认为有两个调用,而第一个显然是mock.method(Parameter{field=0});
我如何指示Mockito正确识别这种情况?
答案 0 :(得分:0)
如果不使用Matchers来检查活动,则Moquite将使用equals来检查活动。
当您传递相同的引用时(我想Parameter在执行.equals()时会检查对象身份而不是其值),您的行中有两次针对Mockito的调用
then(mock).should().method(new Parameter(1)); // LINE 3
因此您可以为参数创建新的引用
Parameter zero = new Parameter(0)
Parameter one = new Parameter(1)
或者您可以使用Matchers(例如Mockito.argThat)
// I didn't try this out - you need hamcrest on your classpath
then(mock).should().method(Mockito.argThat(new HasPropertyWithValue("field", new IsEqual(0)))