eq()方法在单元测试中的使用



我正在为书籍的更新方法编写单元测试用例。

@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会返回一个类似null0的伪值,并将Matcher详细信息("any"或"等于零"(保存到其堆栈中。因此,当Mockito看到对when的调用时,堆栈上应该正好有0个匹配器(使用相等(或2个匹配器。

对于像when(yourMock).method(0, anyInt()).thenVerb(...)这样的调用,Mockito无法判断两个整数参数中哪一个应该是零,哪一个参数应该是任何值,所以它会抛出您看到的错误。如果您不使用匹配器,eq是默认行为,因此您可能很少看到eq,除非您非常明确,或者如果您将eq风格的匹配与any等其他匹配器混合使用。

最新更新