我有一个可以被多次调用的模拟对象的方法(想想递归)。该方法定义如下:
public void doCommit() { }
为了告诉它失败,我使用这个约定:
doThrow(new RuntimeException()).when(mMockedObject).doCommit();
但是,这个方法会在调用它时抛出此异常。我怎样才能这样做,例如,它只在第一次和第三次被调用时抛出它?这意味着,例如,第二次和第四次它只返回而不抛出异常。请注意,我不是doCommit()的作者,也没有可以更改的源代码。
答案 0 :(得分:57)
我想通了(有一些来自伊戈尔的提示)。这是你连续的void方法调用的方法:
doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();
谢谢伊戈尔!
答案 1 :(得分:18)
阅读Stubbing Consecutive Calls doco,这样的事情可能会这样做:
when(mMockedObject.doCommit())
.thenThrow(new RuntimeException())
.thenCallRealMethod()
.thenThrow(new RuntimeException())
.thenCallRealMethod();
如果您不想实际调用底层方法,那么您应该使用thenAnswer
而不是thenCallRealMethod
方法,并提供一个空的存根文件。