声明:
Author:赵志乾
Date:2017-7-30
Declaration:All Right Reserved!!!
从Mock对象返回结果
如果没有显式定义Mock对象的返回结果,JMock将会为带返回值的Mock对象方法返回适当的结果。在大多数的测试中,我们需要显式的定义当Mock对象的某个方法被调用时应当返回的结果。
1、returnValue动作
可以在预期的will子句中,通过使用returnValue这个动作为Mock对象的方法调用定义返回结果。如下例所示:
oneOf (calculator).add(2, 2); will(returnValue(5));
注意:如果我们定义的返回结果类型不正确,JMock将会判定测试失败。
2、returnIterator动作
可以在预期的will子句中,通过使用returnIterator这个动作为Mock对象的方法调用定义返回集合的迭代器。如下例所示:
final List<Employee> employees = new ArrayList<Employee>(); employees.add(alice); employees.add(bob); context.checking(new Expectations() {{ oneOf (department).employees(); will(returnIterator(employees)); }});
注意:使用returnValue和returnIterator动作之间的区别在于:使用returnValue动作时,每次返回的结果都是一样的,一次调用就会消耗掉所有的迭代器;而使用returnIterator动作时,每次调用会消耗掉一个迭代器,即每次调用会返回一个新的迭代器。
3、onConSecutiveCalls动作
可以在预期的will子句中,通过使用onConsecutiveCalls这个动作为Mock对象的方法调用定义不同的返回结果或者定义不同的动作。如下例所示:
atLeast(1).of (anObject).doSomething(); will(onConsecutiveCalls( returnValue(10), returnValue(20), returnValue(30)));
注意:除了上面的这种方式,还可以通过定义多条预期来达到对Mock对象的连续调用返回不同结果的目的。如下例所示:
注:本博客中的实例代码均来自于JMock Cookbook。
oneOf (anObject).doSomething(); will(returnValue(10)); oneOf (anObject).doSomething(); will(returnValue(20)); oneOf (anObject).doSomething(); will(returnValue(30));