我正在为书籍的更新方法编写单元测试用例。
@Test
void testUpdateBook() {
//initializing the bookId here
givenBookId();
//initializing the book here
givenBook();
givenMock();
//call the updateBook method
whenUpdateBookRequested();
thenVerifyBook();
}
givenMock() {
when(bookRepository.updateBook(bookId,any()).thenReturn(Optional.ofNullable(expectedBook));
}
其他所有方法都运行良好,但givenLock((正在产生错误:
Invalid use of argument matchers. 2 matchers expected, 1 recorded
如果我像下面这样写同样的方法,那么测试运行成功了,但我无法理解eq((的含义。有人能解释一下以前的方法和修改后的方法之间的区别吗?
givenMock(){
when(bookRepository.updateBook(eq(bookId),any()).thenReturn(Optional.ofNullable(expectedBook));
}
这与Mockito的实现方式直接相关。
当您存根一个方法时,Mockito希望您传递参数值或匹配器。你应该考虑一个非常重要的细节。参数应为所有精确值或全部匹配符。
看看这些例子:
when(repository.updateBook(bookId, any()).thenReturn(something); // error
when(repository.updateBook(any(), someBook).thenReturn(something); // error
when(repository.updateBook(bookId, someBook).thenReturn(something); // valid
when(repository.updateBook(eq(bookId), any()).thenReturn(something); // valid
when(repository.updateBook(any(), eq(someBook)).thenReturn(something); // valid
when(repository.updateBook(any(), any()).thenReturn(something); // valid
错误消息告诉您这一点。Mockito预计两个论点都是匹配的,但它只发现了一个。
Invalid use of argument matchers. 2 matchers expected, 1 recorded
如ETO所述,如Mockito文档所述:
警告:
如果使用参数匹配器,则所有参数都必须由匹配器提供。
我对Mockito火柴是如何工作的问题有更深入的了解?,但简而言之,对Matchers的调用会产生副作用。当您调用any()
或eq(bookId)
时,Mockito会返回一个类似null
或0
的伪值,并将Matcher详细信息("any"或"等于零"(保存到其堆栈中。因此,当Mockito看到对when
的调用时,堆栈上应该正好有0个匹配器(使用相等(或2个匹配器。
对于像when(yourMock).method(0, anyInt()).thenVerb(...)
这样的调用,Mockito无法判断两个整数参数中哪一个应该是零,哪一个参数应该是任何值,所以它会抛出您看到的错误。如果您不使用匹配器,eq
是默认行为,因此您可能很少看到eq
,除非您非常明确,或者如果您将eq
风格的匹配与any
等其他匹配器混合使用。