2013-07-03 131 views
0

有沒有什麼辦法可以設置JMock的onConsecutiveCalls方法,以便循環回到第一個行爲,當它到達傳遞參數列表的末尾時傳遞? 在下面的示例代碼中,我希望模擬返回true->false->true->Ad infinitumJmock循環連續調用

模擬設置:

final MyService myServiceMocked = mockery.mock(MyService.class); 

mockery.checking(new Expectations() {{ 
    atLeast(1).of(myServiceMocked).doSomething(with(any(String.class)), with(any(String.class))); 
    will (onConsecutiveCalls(
    returnValue(true), 
    returnValue(false) 
)); 
}}); 

方法調用DoSomething的方法:

... 
for (String id:idList){ 
    boolean first = getMyService().doSomething(methodParam1, someString); 
    boolean second = getMyService().doSomething(anotherString, id); 
} 
... 

回答

0

我解決此問題得到了通過添加以下到我的測試類,然後在地方的呼叫onRecurringConsecutiveCalls()onConsecutiveCalls()

附加代碼:

/** 
* Recurring version of {@link org.jmock.Expectations#onConsecutiveCalls(Action...)} 
* When last action is executed, loops back to first. 
* @param actions Actions to execute. 
* @return An action sequence that will loop through the given actions. 
*/ 
public Action onRecurringConsecutiveCalls(Action...actions) { 
    return new RecurringActionSequence(actions); 
} 
/** 
* Recurring version of {@link org.jmock.lib.action.ActionSequence ActionSequence} 
* When last action is executed, loops back to first. 
* @author AnthonyW 
*/ 
public class RecurringActionSequence extends ActionSequence { 
    List<Action> actions; 
    Iterator<Action> iterator; 

    /** 
    * Recurring version of {@link org.jmock.lib.action.ActionSequence#ActionSequence(Action...) ActionSequence} 
    * When last action is executed, loops back to first. 
    * @param actions Actions to execute. 
    */ 
    public RecurringActionSequence(Action... actions) { 
     this.actions = new ArrayList<Action>(Arrays.asList(actions)); 
     resetIterator(); 
    } 

    @Override 
    public Object invoke(Invocation invocation) throws Throwable { 
     if (iterator.hasNext()) 
      return iterator.next().invoke(invocation); 
     else 
      return resetIterator().next().invoke(invocation); 
    } 

    /** 
    * Resets iterator to starting position. 
    * @return <code>this.iterator</code> for chain calls. 
    */ 
    private Iterator<Action> resetIterator() { 
     this.iterator = this.actions.iterator(); 
     return this.iterator; 
    } 
} 

注:該代碼是基於從JMock的2.1的源代碼。