Mockito参数匹配器any()-使用any()调用的verify方法的参数不同!

z2acfund  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(208)

我试着写一个测试,我只是简单地检查一个方法是否在一个mock上被调用了。应该很容易,我已经用verify做了很多次了,但是由于某种原因,我的测试失败了,因为它似乎是在比较实际的调用参数和<any Type>
我的代码:

val mockSearchApi = mock<SearchApi>()
whenever(mockSearchApi.searchBrands(any(), any(), any(), any(), any(), any(), any(), any()))
     .thenReturn(Single.just(getSearchApiResponse()))

// Some code that causes the api .searchBrands to get called

verify(mockSearchApi, times(1)).searchBrands(any(), any(), any(), any(), any(), any(), any(), any())

则测试失败并出现错误

Argument(s) are different! Wanted:
searchApi.searchBrands(
    <any java.lang.Boolean>,
    <any java.util.List>,
    <any java.lang.Integer>,
    <any java.lang.Integer>,
    <any java.lang.String>,
    <any java.lang.String>,
    <any java.lang.Boolean>,
    <any java.util.Map>
);
-> at ...
Actual invocations have different arguments:
searchApi.searchBrands(
    false,
    [],
    1,
    null,
    null,
    null,
    true,
    {}
);

那么方法被调用了,参数类型也是正确的,那么为什么会失败呢?
我也尝试过将所有的any()调用改为anyBoolean()、anyList()、anyString()等,同样的情况也发生了。我还确保了代码以正确的顺序调用参数,就像我以前在模拟中看到的那样。

busg9geu

busg9geu1#

很可能您使用的是mockito-kotlin的any()
原始ArgumentMatchers行为:

  • any()-匹配任何内容,包括null和varargs。
  • any​(Class<T> type)-匹配给定类型的任何对象,空值除外。
  • 两个函数都返回空值

为了防止在返回null时出现异常,mockito-kotlin更改了此行为。请参见Matchers.kt

/** Matches any object, excluding nulls. */
inline fun <reified T : Any> any(): T {
    return ArgumentMatchers.any(T::class.java) ?: createInstance()
}

/** Matches anything, including nulls. */
inline fun <reified T : Any> anyOrNull(): T {
    return ArgumentMatchers.any<T>() ?: createInstance()
}

mockito-kotlin匹配器行为:

  • any()委托给ArgumentMatchers.any(T::class.java),因此不匹配空值
  • anyOrNull()委托给ArgumentMatchers.any<T>(),因此与null匹配

相关问题