我正在为这本书的更新方法编写单元测试用例。
@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));
}
其他方法都可以正常工作,但Mock()会产生错误:Invalid use of argument matchers. 2 matchers expected, 1 recorded
如果我写了同样的方法,那么测试运行成功了,但是我不能理解eq()的意思。有人能解释一下之前的方法和修改后的方法之间的区别吗?
givenMock(){
when(bookRepository.updateBook(eq(bookId),any()).thenReturn(Optional.ofNullable(expectedBook));
}
2条答案
按热度按时间8tntrjer1#
这与Mockito的实现方式直接相关。
当你存根一个方法时,Mockito期望你传递参数值或匹配器。有一个非常重要的细节你应该考虑。参数应该是所有精确值或所有匹配器。
看看这些例子:
Mockito期望两个参数都是匹配器,但是它只找到了一个。
6ju8rftf2#
作为ETO described和as the Mockito documentation describes:
警告:
如果您使用参数匹配器,则所有参数都必须由匹配器提供。
我对问题How do Mockito matchers work?有更深入的描述,但简而言之,调用Matcher是通过副作用来工作的。因此,当Mockito看到对
when
的调用时,堆栈上应该正好有0个匹配器(使用相等)或2个匹配器(使用匹配器)。对于像
when(yourMock).method(0, anyInt()).thenVerb(...)
这样的调用,Mockito无法判断两个整型参数中的哪个应该是零,哪个应该是任意值,因此它会抛出您看到的错误。如果不使用匹配器,eq
是默认行为,因此您可能很少看到eq
,除非您非常明确地使用eq
样式的匹配,或者将eq
样式的匹配与其他匹配器(如any
)混合使用。