假设有一个带回调的接口:
interface SomeInterface {
fun doSomething(arg: String, callback: (Exception?, Long) -> Unit)
}
我延伸到这样的挂起函数:
suspend fun SomeInterface.doSomething(arg: String): Long = suspendCoroutine { cont ->
this.doSomething(arg) { err, result ->
if (err == null) {
cont.resume(result)
} else {
cont.resumeWithException(err)
}
}
}
我想在测试中嘲笑这个,但是我失败了.
理想情况下,我想使用这样的东西:
@Test
fun checkService() {
runBlocking {
val myService = mock<SomeInterface>()
whenever(myService.doSomething(anyString())).thenReturn(1234L)
val result = myService.doSomething("")
assertEquals(result, 1234L)
}
}
上面的语法因mockito异常而失败,因为它期望回调的匹配器.
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
我该如何模拟这样的暂停函数?
如果无法使用类似的语法,我怎样才能使用所需的参数进行模拟回调,以便在我的代码中使用的挂起变量在测试期间返回所需的结果?
更新:
当它是一个扩展功能时似乎不可能.基于Marko Topolnik的评论,我收集它是因为扩展只是一个静态函数,它不具备mockito的能力.
当suspend函数是一个成员函数时,它会按照我原来的语法按预期工作.
这是一个带有一些演示代码的要点:
https://gist.github.com/mirceanis/716bf019a47826564fa57a77065f2335
最佳答案 我建议你使用
MockK进行测试,它更适合于公司.
要模拟协程,您可以使用coEvery并返回如下:
val interface = mockk<SomeInterface>()
coEvery { a.doSomething(any()) } returns Outcome.OK