我试着写一个测试,我只是简单地检查一个方法是否在一个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()等,同样的情况也发生了。我还确保了代码以正确的顺序调用参数,就像我以前在模拟中看到的那样。
1条答案
按热度按时间busg9geu1#
很可能您使用的是mockito-kotlin的
any()
原始
ArgumentMatchers
行为:any()
-匹配任何内容,包括null和varargs。any(Class<T> type)
-匹配给定类型的任何对象,空值除外。为了防止在返回
null
时出现异常,mockito-kotlin更改了此行为。请参见Matchers.ktmockito-kotlin匹配器行为:
any()
委托给ArgumentMatchers.any(T::class.java)
,因此不匹配空值anyOrNull()
委托给ArgumentMatchers.any<T>()
,因此与null匹配