使用mockito的Stub-void方法



我有一个对象,我想在调用它时通过增加计数器来替换它的方法功能。不过,该方法有一个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());

相关内容

  • 没有找到相关文章

最新更新