如何在第一次调用mocked方法时抛出异常?

fnC*_*zar 38 unit-testing mocking mockito

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

public void doCommit() { }
Run Code Online (Sandbox Code Playgroud)

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

doThrow(new RuntimeException()).when(mMockedObject).doCommit();
Run Code Online (Sandbox Code Playgroud)

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

fnC*_*zar 60

我想通了(有一些来自伊戈尔的提示).这是你连续的void方法调用的方法:

doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();
Run Code Online (Sandbox Code Playgroud)

谢谢伊戈尔!


Igo*_*aka 21

阅读Stubbing连续调用doco,这样的事情可能会这样做:

when(mMockedObject.doCommit())
  .thenThrow(new RuntimeException())
  .thenCallRealMethod() 
  .thenThrow(new RuntimeException())
  .thenCallRealMethod();
Run Code Online (Sandbox Code Playgroud)

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

  • 如果使用`doThrow().doCallRealMethod().when(mMockedObject).doCommit();`?可能需要将它重写回前面. (2认同)