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

Psy*_*nch 5 java unit-testing mockito

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

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

使用 Mockito(和 JUnit),我认为可以完成的唯一方法是使用doAnswerand verify,例如:

doAnswer(new Answer() {
  //check arguments here
}).when(service).operate(any(Data.class));
Run Code Online (Sandbox Code Playgroud)

然后我必须验证该操作是否实际被调用:

verify(service).operate(any(Data.class));
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码会干扰,doAnswer好像它是对相关方法的实际调用。我如何解决这个问题,以便我既可以验证方法是否被调用,又可以验证它获取的参数是否正确?

Par*_*mal 1

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

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

更多参考这里

我希望这会有所帮助