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

dbf7pr2w  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(590)

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

@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));
}
8tntrjer

8tntrjer1#

这与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
6ju8rftf

6ju8rftf2#

作为ETO describedas 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)混合使用。

相关问题