使用 mockito 存根 void 方法

Stub void method using mockito

我有一个对象,我想通过在调用它时增加一个计数器来替换其方法功能。该方法有一个 void return 类型,所以我一直在研究如何使用 mockito 存根 void 方法,但没有找到有效的解决方案。根据我的阅读,我认为我可以做这样的事情:

int count = 0;
Mockito.doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString());

当我 运行 这个时,我得到

org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue

所以我相信我找到了两个解决方案:使用 doThrow,我可以捕获异常并增加计数器或使用 toAnswer 并在 [=14= 的实现中增加计数器].还有其他解决方案吗?

doThrow 是一种非常规的处理方式,我强烈建议不要使用它——尤其是因为它是一个不寻常的代码路径,并且会阻止您的其余被测方法在抛出异常后工作。

doAnswer 是一种更合适的方法,可以使任意行为作为 void 方法的结果发生,包括计数。

但是,如果计数器的目的只是简单地确保某个方法被调用的确切次数,那么您根本不需要存根; Mockito 对 void 方法的默认设置是除了记录调用之外什么也不做,这对这种情况很好。相反,使用验证:

verify(mockObject, times(EXPECTED_COUNT)).mockObjectMethod(anyString());

作为旁注,请注意不要混淆:

doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString());

使用(假设的)语法如下:

doReturn(() -> ++count).when(mockObject).mockObjectMethod(Mockito.anyString());
//       ^---lambda--^

除了 Mockito 匹配器(通过非常违反直觉的黑客攻击)之外,Mockito 在其 Java 语法中没有得到特殊对待。如果 count = 0 而你 运行 你拥有什么,那么这正是 Mockito 将看到的:

doReturn(1).when(mockObject).mockObjectMethod(Mockito.anyString());