Mockito错误(?)因可变类的TooManyActualInvocations错误而失败

时间:2018-08-05 09:15:10

标签: mockito

以下是说明失败的测试。

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正确识别这种情况?

1 个答案:

答案 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)))