在kotlin中,如何模拟包装回调的挂起函数?

假设有一个带回调的接口:

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
点赞