函数含回调接口时,Mock另一参数失败问题求助
解决Mockito-Kotlin中InvalidUseOfMatchersException的问题
嘿,这个坑我踩过好多次!你遇到的org.mockito.exceptions.misusing.InvalidUseOfMatchersException本质是参数匹配器和具体参数值混用导致的,Mockito对参数匹配的规则很严格:要么所有参数都用匹配器(比如any()、eq()),要么全用具体的常量值,绝对不能一半一半。
为什么单回调参数时没问题?
当你的异步函数只有回调接口这一个参数时,你可能写的是:
`when`(mockRepo.fetchData(any<DataCallback>())).thenAnswer { ... }
这里只有一个参数,用了匹配器any(),完全符合规则,所以不会报错。
加了String/Integer参数后为什么报错?
比如你改成了这样(错误示例):
// ❌ 错误:一个具体值,一个匹配器,混用了! `when`(mockRepo.fetchComicList("ironman", any<ComicCallback>())).thenAnswer { ... }
这里第一个参数是具体字符串"ironman",第二个是匹配器any(),Mockito会认为你应该提供2个匹配器,但只收到1个,所以抛出异常。
正确的解决方法
分两种场景处理:
1. 需要验证某个具体的参数值
用eq()把具体值包裹起来,告诉Mockito你要匹配这个精确值:
// ✅ 正确:所有参数都用匹配器 `when`(mockRepo.fetchComicList(eq("ironman"), any<ComicCallback>())).thenAnswer { invocation -> // 获取回调参数并触发成功逻辑 val callback = invocation.getArgument<ComicCallback>(1) callback.onSuccess(mockComicList) null } // 验证的时候也要保持一致 verify(mockRepo).fetchComicList(eq("ironman"), any<ComicCallback>())
2. 不需要验证具体参数值
直接用对应类型的匹配器替代具体值,比如字符串用anyString(),整数用anyInt():
// ✅ 正确:全用匹配器 `when`(mockRepo.fetchComicList(anyString(), any<ComicCallback>())).thenAnswer { invocation -> val callback = invocation.getArgument<ComicCallback>(1) callback.onSuccess(mockComicList) null }
额外提醒(异步测试关键点)
因为是异步函数,一定要用thenAnswer而不是thenReturn,这样你才能拿到回调参数并主动触发它的回调方法(比如onSuccess或onError),否则测试会因为异步逻辑没执行完而失败。
内容的提问来源于stack exchange,提问作者di0n0s
相关产品推荐
相关产品推荐

