我有一个对象,其方法功能我想通过在调用时递增计数器来替换它。该方法虽然有void
返回类型,所以我一直在研究如何使用mockito对void方法进行存根,但是没有找到可行的解决方案。从我读到的,我以为我可以做这样的事情:
int count = 0;
Mockito.doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString());
当我运行时,我得到了
org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue
所以我相信我找到了两个解决方案:使用doThrow
,我可以捕获异常并递增计数器或使用toAnswer
并在Answer
的实现中递增计数器。还有其他解决方案吗?
答案 0 :(得分:1)
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());