Java 莫基托';s验证方法干扰doAnswer';s支票

Java 莫基托';s验证方法干扰doAnswer';s支票,java,unit-testing,mockito,Java,Unit Testing,Mockito,在使用mock进行单元测试时,我经常遇到需要检查mock的某个方法是否使用正确的参数调用。这意味着我必须找到一种方法来窥探传递给所讨论的方法的内容。在Spock中,这可以通过以下方式实现: 1 * serviceMock.operate(*_) >> { args -> def argument = args[0] assert expectedValue = argument.actualValue } doAnswer(new Answer() { /

在使用mock进行单元测试时,我经常遇到需要检查mock的某个方法是否使用正确的参数调用。这意味着我必须找到一种方法来窥探传递给所讨论的方法的内容。在Spock中,这可以通过以下方式实现:

1 * serviceMock.operate(*_) >> { args ->
    def argument = args[0]
    assert expectedValue = argument.actualValue
}
doAnswer(new Answer() {
  //check arguments here
}).when(service).operate(any(Data.class));
对于Mockito(和JUnit),我认为实现这一点的唯一方法是使用
doAnswer
verify
,类似于:

1 * serviceMock.operate(*_) >> { args ->
    def argument = args[0]
    assert expectedValue = argument.actualValue
}
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());
ArgumentCaptor argument=ArgumentCaptor.forClass(Data.class);
验证(服务).operate(参数.capture());
assertEquals(“John”,参数.getValue().getDataName());
更多参考


我希望这会有帮助

你试过ArgumentCaptor吗?应该有用不,我以前从没听说过。它一直告诉我没有价值被捕获。我是在实际调用之前指定这些行,还是在实际调用之后指定这些行?只是澄清一下,在这个上下文中,u将数据对象发送到方法operate right?你是说在实际调用mock时?对我有一个对
服务的实际呼叫。操作(实际数据)