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模拟验证

+0

你基本上问:“我的我会永远需要模拟测试类”,其中谷歌一定能够帮助您。另外:http://code.google.com/p/mockito/wiki/FeaturesAndMotivations –

+1

可能重复[What's Mocking?](http://*.com/questions/2665812/what-is-mocking) – nes1983

要测试的是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

希望你有所作为。

+0

什么我能通过这样做发现吗?我仍然没有看到一个实际的例子 – titus

+0

@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方法的执行一次