使用mockito的Stub void方法

时间:2016-05-05 15:33:29

标签: mockito void stub

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

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

当我运行时,我得到了

  

org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue

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

1 个答案:

答案 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());