Mockito的verify方法干扰了doAnswer的检查。

6
在进行单元测试时,使用模拟(mock)时,我经常需要检查模拟对象的某个方法是否被调用,并且传入了正确的参数。这意味着我必须找到一种途径来查看传递给被测试方法的参数。在Spock中,可以使用以下类似的方式实现:
1 * serviceMock.operate(*_) >> { args ->
    def argument = args[0]
    assert expectedValue = argument.actualValue
}

使用Mockito(和JUnit),我认为唯一的方法是使用doAnswer和verify,类似于:
doAnswer(new Answer() {
  //check arguments here
}).when(service).operate(any(Data.class));

然后我必须验证操作实际上是否被调用,具体如下:

verify(service).operate(any(Data.class));

然而,上述代码会干扰doAnswer,就好像它是实际调用的方法一样。那么我该如何解决这个问题,以便既能验证方法是否被调用,又能验证传递给它的参数是否正确?


你试过 ArgumentCaptor<T> 吗? - Paraneetharan Saravanaperumal
这个问题应该很有用:如何使用 ArgumentCaptor 进行存根。 - troig
不,实际上我以前从未听说过它。 - Psycho Punch
1个回答

1
Mockito使用自然的Java风格通过equals()方法验证参数值。这也是建议的匹配参数的方式,因为它使测试简洁明了。
ArgumentCaptor<Data> argument = ArgumentCaptor.forClass(Data.class);
verify(service).operate(argument.capture());
assertEquals("John", argument.getValue().getDataName());

更多参考请点击这里

希望这会有所帮助


它一直告诉我没有捕获到任何值。我是在实际调用之前还是之后指定这些行? - Psycho Punch
只是澄清一下,在这个上下文中,你发送了一个数据对象到操作方法对吧? - Paraneetharan Saravanaperumal
你的意思是在对模拟对象进行实际调用时?是的。我有一个对service.operate(actualData)的实际调用。 - Psycho Punch

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