mockito模拟验证
//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();
我不明白这个构造的意义是什么?它有什么帮助?与调用函数有什么不同?
该文档相当薄。
谢谢mockito模拟验证
要测试的是A类的一些方法Foo
调用一些方法Bar
类B.换句话说,你在测试类A.在测试期间的对象,你让B类的模拟然后你将这个模拟对象以某种方式传递给A类(取决于A类的实际工作方式)。当您的测试运行A类的Foo
方法时,您期望Bar
方法在您的B类模拟上被调用。通过调用verify
作为Bar
方法,在对Foo
方法进行测试后,您可以检查Foo
方法实际上工作正常 - 它叫Bar
。
当你这样做mockedList.add("one");
其执行mocked object
的操作同时它会记住你的操作。因此,当您执行verify(mockedList).add("one");
时,它会验证在mockedList
上调用add
时参数one
。
希望你有所作为。
什么我能通过这样做发现吗?我仍然没有看到一个实际的例子 – titus
@titus这是一个简单的例子。当您将此对象传递给某个自定义方法时,请考虑一个场景。现在您想验证一下,该对象上的某个特定方法是否被调用或否。这将很有用。另一个区别是使用你的模拟对象进行存根,当你在处理对象时变得非常重要,而这些对象在你的测试环境中是不可用的。你可以简单地模拟和存根他们。一旦被调用,mockito将使用stubbed行为。 –
事实上,在你的例子很明显,但在真正的代码测试验证方法调用的主要思想出现 - 想象一些代码执行方法调用,比如:
class A{
....
service.doSomething(<some arguments>)
....
}
为了测试它,你会通过模拟服务对象,但有时你想验证为该调用传递的特定参数值(或调用次数),所以你会像在你的例子中那样使用验证。
的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方法的执行一次
你基本上问:“我的我会永远需要模拟测试类”,其中谷歌一定能够帮助您。另外:http://code.google.com/p/mockito/wiki/FeaturesAndMotivations –
可能重复[What's Mocking?](http://stackoverflow.com/questions/2665812/what-is-mocking) – nes1983