Mockito的验证方法干扰了doAnswer的检查



在使用mock进行单元测试时,我经常需要检查mock的某个方法是否用正确的参数调用。这意味着我必须找到一种方法来窥探传递给有问题的方法的内容。在斯波克,这可以使用类似的东西来完成:

1 * serviceMock.operate(*_) >> { args ->
    def argument = args[0]
    assert expectedValue = argument.actualValue
}

对于Mockito(和JUnit),我认为唯一可以做到这一点的方法是使用doAnswerverify,类似于:

doAnswer(new Answer() {
  //check arguments here
}).when(service).operate(any(Data.class));

然后我必须验证操作是否真的被调用:

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

然而,上面的代码会干扰doAnswer,就好像它是对所讨论方法的实际调用一样。我该如何解决这个问题,以便既能验证方法是否被调用,又能验证它得到的参数是否正确?

Mockito以自然java风格验证参数值:使用equals()方法。这也是匹配参数的推荐方式,因为它使测试变得干净&易于理解的

ArgumentCaptor<Data> argument = ArgumentCaptor.forClass(Data.class);
verify(service).operate(argument.capture());
assertEquals("John", argument.getValue().getDataName());

更多信息请参阅此处

我希望这将对有帮助

相关内容

  • 没有找到相关文章