在使用mock进行单元测试时,我经常需要检查mock的某个方法是否用正确的参数调用。这意味着我必须找到一种方法来窥探传递给有问题的方法的内容。在斯波克,这可以使用类似的东西来完成:
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
,就好像它是对所讨论方法的实际调用一样。我该如何解决这个问题,以便既能验证方法是否被调用,又能验证它得到的参数是否正确?
Mockito以自然java风格验证参数值:使用equals()方法。这也是匹配参数的推荐方式,因为它使测试变得干净&易于理解的
ArgumentCaptor<Data> argument = ArgumentCaptor.forClass(Data.class);
verify(service).operate(argument.capture());
assertEquals("John", argument.getValue().getDataName());
更多信息请参阅此处
我希望这将对有帮助