使用Mockito创建桩方法

3

我有一个对象,我想通过调用时增加计数器来替换其方法功能。但是该方法的返回类型为void,因此我一直在研究如何使用mockito存根化void方法,但是我没有找到可行的解决方案。根据我所读的内容,我认为可以尝试以下代码:

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

当我执行这个程序时,会得到以下错误信息:

org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue

因此,我认为有两种解决方法:使用doThrow,在其中捕获异常并增加计数器,或者使用toAnswer,在实现Answer时增加计数器。还有其他解决方案吗?

1
https://dev59.com/zHE95IYBdhLWcg3wheNR - tt_emrah
1个回答

2

doThrow 是一种非常不寻常的处理方式,我强烈建议不要使用它——特别是因为它是一条不寻常的代码路径,并且在抛出异常后将阻止您测试的方法其余部分正常工作。

doAnswer 是一个更合适的方式来使任意行为发生作为无返回值方法的结果,包括计数。

然而,如果计数器的目的只是确保方法被调用了精确的次数,那么你根本不需要存根; Mockito 的默认行为是对于无返回值方法什么都不做,除了记录调用,这对于这种情况是可以接受的。相反,请使用验证:

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

作为一个旁注,非常注意不要混淆这个:
doReturn(++count).when(mockObject).mockObjectMethod(Mockito.anyString());

使用类似以下(假设的)语法:

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

除了通过非常反直觉的方法使用Mockito匹配器(Matchers),Mockito在其Java语法中并没有特殊处理。如果count = 0,并且您运行当前代码,则Mockito将仅看到以下内容:
doReturn(1).when(mockObject).mockObjectMethod(Mockito.anyString());

使用 verify 是有意义的,但我不想执行模拟对象的方法体。我只想计算它被调用的次数,什么都不做。我能把 verify 和 doNothing 结合起来吗? - user1491636
@user1491636 绝对没问题。使用doNothing删除现有的行为,然后稍后再使用verify方法调用计数。很抱歉第一次没有注意到! - Jeff Bowman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接