Unit testing 如何仅在第一次调用模拟方法时引发异常?

Unit testing 如何仅在第一次调用模拟方法时引发异常?,unit-testing,mockito,mocking,Unit Testing,Mockito,Mocking,我有一个模拟对象的方法,可以多次调用(想想递归)。方法的定义如下: public void doCommit() { } 为了告诉它失败,我使用以下约定: doThrow(new RuntimeException()).when(mMockedObject).doCommit(); 但是,这使得该方法在每次调用时都抛出此异常。我如何使它只在第一次和第三次调用时抛出它?这意味着,例如,在第二次和第四次返回时,它不会抛出异常。请注意,我不是doCommit()的作者,也没有可以更改的源代码。阅读

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

public void doCommit() { }
为了告诉它失败,我使用以下约定:

doThrow(new RuntimeException()).when(mMockedObject).doCommit();
但是,这使得该方法在每次调用时都抛出此异常。我如何使它只在第一次和第三次调用时抛出它?这意味着,例如,在第二次和第四次返回时,它不会抛出异常。请注意,我不是doCommit()的作者,也没有可以更改的源代码。

阅读,类似这样的内容可以:

when(mMockedObject.doCommit())
  .thenThrow(new RuntimeException())
  .thenCallRealMethod() 
  .thenThrow(new RuntimeException())
  .thenCallRealMethod();
如果您不想实际调用底层方法,那么应该使用而不是方法,并提供一个空的存根实现。

我找到了答案(从Igor得到了一些提示)。以下是存根连续void方法调用的方式:

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

谢谢你,伊戈尔

我不确定这是否会奏效(但你可能会发现一些东西)。当我写这篇文章时:When(mMockedUpdatingBatch.updateBatch()).thenthow(newruntimeexception());我得到了这个编译错误:Mockito类型中的when(T)方法不适用于参数(void)。我认为when()期望模拟的方法是非空的。如果可能的话,可能需要使用
doThrow().doCallRealMethod().when(mMockedObject.doCommit()?使用
BDDMockito
将是
willThrow(新运行时异常()).willNothing().willThrow(…).willNothing().given(mMockedObject.doCommit()