44

我有一个可以多次调用的模拟对象的方法(想想递归)。该方法定义如下:

public void doCommit() { }

为了告诉它失败,我使用了这个约定:

doThrow(new RuntimeException()).when(mMockedObject).doCommit();

但是,这会使该方法在每次调用时都抛出此异常。例如,我怎样才能使它只在第一次和第三次被调用时抛出它?这意味着,例如,第二次和第四次它只是返回而不抛出异常。请注意,我不是 doCommit() 的作者,也没有可以更改的源代码。

4

2 回答 2

65

我想通了(伊戈尔的一些提示)。这是您存根连续 void 方法调用的方式:

doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();

谢谢伊戈尔!

于 2010-08-17T00:23:42.877 回答
21

阅读Stubbing Consecutive Calls doco,这样的事情可能会做到:

when(mMockedObject.doCommit())
  .thenThrow(new RuntimeException())
  .thenCallRealMethod() 
  .thenThrow(new RuntimeException())
  .thenCallRealMethod();

如果您不想实际调用底层方法,那么您应该使用thenAnswer而不是thenCallRealMethod方法并提供一个空的存根实现。

于 2010-08-16T23:09:02.257 回答