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