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正确地识别这种情况?
当没有使用匹配器来检查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这次考试不及格。