莫基托模拟验证


//Let's import Mockito statically so that the code looks clearer
import static org.mockito.Mockito.*;
//mock creation
List mockedList = mock(List.class);
//using mock object
mockedList.add("one");
mockedList.clear();
//verification
verify(mockedList).add("one");
verify(mockedList).clear();

我不明白这个结构有什么意义?它有什么帮助?它与仅调用函数有何不同?
文档相当单薄。
谢谢

您希望测试类 A 的某些方法Foo是否调用类 B 对象上的某个方法Bar。 换句话说,您正在测试 A 类。 在测试期间,您模拟了 B 类。 然后你以某种方式将这个模拟对象传递给类 A(取决于类 A 的实际工作方式)。 当您的测试运行类 A 的Foo方法时,您希望在类 B 的模拟上调用Bar方法。 通过为Bar方法调用verify,在测试Foo方法后,您可以检查Foo方法是否实际正常工作 - 它是否调用Bar

当您mockedList.add("one");它同时在mocked object上执行操作时,它会记住您的操作。所以当你做verify(mockedList).add("one");时,它会用参数one验证add被调用mockedList

希望你能有所作为。

mockito 的验证方法是验证方法调用次数,如果调用时间为 1,我们可以省略这个参数,参见 Mockito 的源代码 1473 行

public static <T> T verify(T mock) {
return MOCKITO_CORE.verify(mock, times(1));
}

所以你编码

verify(mockedList).add("one");
//is the same as
verify(mockedList,times(1)).add("one");

确实是为了验证 add 方法执行一次

事实上,在您的示例中,这很明显,但是验证方法调用的主要思想是在实际代码测试期间出现的 - 想象一下某些代码执行方法调用,如下所示:

class A{
....
service.doSomething(<some arguments>)
....
}

为了测试它,您将传递模拟服务对象,但有时您希望验证为该调用传递的特定参数值(或调用次数),因此您将像示例中一样使用 verify 。

最新更新