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

时间:2016-04-18 10:08:18

标签: java unit-testing mockito

当使用模拟进行单元测试时,我经常需要检查是否使用适当的参数调用模拟的某个方法。这意味着我必须以某种方式找到一种方法来查看传递给相关方法的内容。在Spock中,这可以通过以下方式完成:

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,就好像它是对相关方法的实际调用一样。我如何解决这个问题,以便我可以验证方法是否被调用,并验证它获得的参数是否正确?

1 个答案:

答案 0 :(得分:0)

Mockito使用equals()方法验证自然java风格的参数值。这也是推荐的匹配参数的方法,因为它使测试变得干净。简单。

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

更多参考here

我希望这会有所帮助