动态更改模拟对象返回值

时间:2012-05-18 16:08:56

标签: java easymock powermock

假设我有以下方法:

public void runLoop(SomeIterator it){
    while(it.hasNext()){
        //do something
    }
}

现在我想传入一个SomeIterator Mock对象,该对象将返回Boolean.TRUE以进入循环,但我也希望它在某个时刻返回Boolean.FALSE(比如说​​)例如,在10次之后,有没有办法通过PowerMock / EasyMock实现这一目标?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

以下摘自EasyMock documentation

  

更改同一方法调用的行为

     

还可以为方法指定更改行为。该   方法times,andReturn和andThrow可能会被链接。举个例子,   我们将voteForRemoval(“Document”)定义为

     
      
  • 前三次通话返回42,
  •   
  • 为接下来的四个调用抛出RuntimeException
  •   
  • 返回-42一次。
  •   
expect(mock.voteForRemoval("Document"))
    .andReturn((byte) 42).times(3)
    .andThrow(new RuntimeException(), 4)
    .andReturn((byte) -42);

答案 1 :(得分:1)

我不太了解powermock,但使用easymock的方法是.andAnswer()而不是.andReturn在你的模拟器上。

伪代码:

it.hasNext();
expectLastCall().anyTimes().andAnswer(
    new IAnswer<Boolean>(){ compute your return value }
);