//get mock control MockControl control = MockControl.createControl(Foo.class); //Get the mock object from mock control Foo foo = (Foo) control.getMock();·行为定义方法
public void setReturnValue(... value);
public void setThrowable(Throwable throwable);
public void setVoidCallable();
public void setDefaultReturnValue(... value);
public void setDefaultThrowable(Throwable throwable);
public void setDefaultVoidCallable();
public void setMatcher(ArgumentsMatcher matcher);
public void setDefaultMatcher(ArgumentsMatcher matcher);
MockControl允许开发人员定义伪对象的每一个方法的行为。当他在准备态时,开发人员可以调用伪对象的方法。首先规定哪一个调用方法的行为需要被定义。然后开发人员可以使用行为定义的方法之一来定义行为。例如,看一下下面的Foo类:
//Foo.java public class Foo { public void dummy() throw ParseException { ... } public String bar(int i) { ... } public boolean isSame(String[] strs) { ... } public void add(StringBuffer sb, String s) { ... } }伪对象的行为可以按照下面的方式来定义:
//get mock control MockControl control = MockControl.createControl(Foo.class); //get mock object Foo foo = (Foo)control.getMock(); //begin behavior definition //specify which method invocation's behavior //to be defined. foo.bar(10); //define the behavior -- return "ok" when the //argument is 10 control.setReturnValue("ok"); ... //end behavior definition control.replay(); ...MockControl中超过50个方法是行为定义方法。他们可以如下分类。
o setReturnValue()
这些方法被用来定义最后的方法调用应该返回一个值作为参数。这儿有7个使用原始类型作业参数的`setReturnValue()方法,如setReturnValue(int i)或setReturnValue(float f)。setReturnValue(Object obj)被用来满足那些需要对象作为参数的方法。如果给定的值不匹配方法的返回值,则抛出AssertionFailedError异常。
当然也可以在行为中加入预期调用的次数。这称为调用次数限制。
MockControl control = ... Foo foo = (Foo)control.getMock(); ... foo.bar(10); //define the behavior -- return "ok" when the //argument is 10. And this method is expected //to be called just once. setReturnValue("ok", 1); ...上面的代码段定义了bar(10)方法只能被调用一次。如果提供一个范围又会怎么样呢?
... foo.bar(10); //define the behavior -- return "ok" when the //argument is 10. And this method is expected //to be called at least once and at most 3 //times. setReturnValue("ok", 1, 3); ...现在bar(10)被限制至少被调用一次最多3次。更方便的是Range已经预定义了一些限制范围。
... foo.bar(10); //define the behavior -- return "ok" when the //argument is 10. And this method is expected //to be called at least once. setReturnValue("ok", Range.ONE_OR_MORE); ...Range.ONE_OR_MORE是一个预定义的Range实例,这意味着方法应该被调用至少一次。如果setReturnValue()中没有定义调用次数限制,如setReturnValue("Hello"),Range.ONE_OR_MORE被认为是缺省值。还有两个预定义的Range实例,Range.ONE(就一次)和Range.ZERO_OR_MORE(对调用次数没有限制)。
这儿还有一个特定的设置返回值的方法:setDefaultReturnValue()。他将代替方法的参数值作为返回值,缺省的调用次数限制为Range.ONE_OR_MORE。这被称为方法参数值敏感性。
... foo.bar(10); //define the behavior -- return "ok" when calling //bar(int) despite the argument value. setDefaultReturnValue("ok"); ...o setThrowable
setThrowable(Throwable throwable)被用来定义方法调用异常抛出的行为。如果给定的throwable不匹配方法的异常定义,则AssertionFailedError会被抛出。调用次数的限制与方法参数值敏感性是一致的。
... try { foo.dummy(); } catch (Exception e) { //skip } //define the behavior -- throw ParseException //when call dummy(). And this method is expected //to be called exactly once. control.setThrowable(new ParseException("", 0), 1); ...o setVoidCallable()
setVoidCallable()被用于没有返回值的方法。调用次数的限制与方法参数值敏感性是一致的。
... try { foo.dummy(); } catch (Exception e) { //skip } //define the behavior -- no return value //when calling dummy(). And this method is expected //to be called at least once. control.setVoidCallable(); ...o Set ArgumentsMatcher
在工作态时,MockControl会在伪对象的方法被调用时搜索预定义的行为。有三个因素会影响搜索的标准:方法标识,参数值和调用次数限制。第一和第三个因素是固定的。第二个因素可以通过参数值敏感性来忽略。更灵活的是,还可以自定义参数值匹配规则。setMatcher()可以通过ArgumentsMatcher在准备态时使用。
文章来源于领测软件测试网 https://www.ltesting.net/