当前位置: 首页 > 知识库问答 >
问题:

莫基托错误地(?)可变类的TooManyActualInvocations失败

严嘉良
2023-03-14
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
}

现在,发生的事情似乎是,当field为0时,Mockito在第1行捕获对参数的引用。然后,在下一行中,该字段将增加到1,并一直保持到第3行,在第3行中进行验证。因此,Mockito错误地认为有两次调用,而第一次调用显然是mock.method(参数{field=0});

我如何指示Mockito正确地识别这种情况?

共有1个答案

夹谷承安
2023-03-14

当没有使用匹配器来检查nvokations时,MOKITY使用equals来检查invocatcions

当您传入相同的引用时(我猜当do.equals()时该参数检查对象标识而不是其值),在您的行中有两个对mockito的调用

 then(mock).should().method(new Parameter(1)); // LINE 3

因此您可以创建一个新的参数引用

Parameter zero = new Parameter(0)
Parameter one = new Parameter(1)
// I didn't try this out - you need hamcrest on your classpath
then(mock).should().method(Mockito.argThat(new HasPropertyWithValue("field", new IsEqual(0)))
 类似资料:
  • 我对莫基托有疑问。我想测试这个简单的类: 我写了这个简单的测试: 此测试运行时没有错误。我等待它没有编译,因为没有任何对userService方法的调用…

  • Mockito似乎是一个非常好的Java存根/模拟框架。唯一的问题是我找不到任何关于使用API的最佳方法的具体文档。测试中使用的常用方法包括: 当您在实践中看到Mockito的示例时,您会看到如下代码: 从我读过的所有文档中,我已经识别了几个Mockito“语法”的“模式”,这些“语法”是通过将这些方法调用像上面的示例一样链接在一起而获得的。我发现的一些常见模式有: 当/然后:当(你的方法())。

  • Mockito——我知道间谍在对象上调用实际方法,而模拟在双对象上调用方法。此外,除非有代码气味,否则要避免间谍。然而,间谍是如何工作的?我应该在什么时候使用他们?它们与模拟有什么不同?

  • 我努力嘲笑一个华丽的存储库。以下是实体: 简单存储库: 这是资源: 和一个简单的测试,我尝试模拟存储库: 测试失败,因为响应列表是

  • 为什么Mockito会吞噬堆栈痕迹?例如,如果我有一个 和一个测试,例如 抛出的异常看起来总是 (这里提供的示例只是一个简化--我要处理更多的间接、类等等。我不能让Mockito吞噬部分模拟堆栈跟踪的关键部分……)

  • 试图将我的项目从Java 11更新到Java 17,在一个特定测试中,Mockito出现了一个意外错误。 投掷 不知道为什么Mockito这次考试不及格。