小编Mir*_*tor的帖子

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

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

interface SomeInterface {
    fun doSomething(arg: String, callback: (Exception?, Long) -> Unit)
}
Run Code Online (Sandbox Code Playgroud)

我将其扩展为这样的挂起函数:

suspend fun SomeInterface.doSomething(arg: String): Long = suspendCoroutine { cont ->
    this.doSomething(arg) { err, result ->
        if (err == null) {
            cont.resume(result)
        } else {
            cont.resumeWithException(err)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在测试中模拟这个,但失败了。理想情况下,我想使用这样的东西:

@Test
fun checkService() {
    runBlocking {
        val myService = mock<SomeInterface>()
        whenever(myService.doSomething(anyString())).thenReturn(1234L)
        val result = myService.doSomething("")
        assertEquals(result, 1234L)
    }
}
Run Code Online (Sandbox Code Playgroud)

上述语法因模拟异常而失败,因为它期望回调的匹配器。

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
Run Code Online (Sandbox Code Playgroud)

我怎样才能模拟这样的挂起功能?如果无法使用类似的语法,我如何才能使用所需的参数进行模拟回调,以便在整个代码中使用的挂起变体在测试期间返回所需的结果?

更新:当它是一个扩展功能时,它似乎是不可能的。根据Marko Topolnik的评论,我认为这是因为扩展只是一个静态函数,它超出了 …

mocking callback mockito kotlin kotlinx.coroutines

10
推荐指数
2
解决办法
4276
查看次数

Android Jetpack导航库和onActivityResult

我正在尝试将应用迁移到GoogleIO'18宣布的新导航架构组件

假设我需要使用通常以开始的活动startActivityForResult。该活动来自库活动或系统活动,因此我无法对其进行修改。

有什么方法可以将此活动作为目的地包含在导航图中并从中获取结果?

android android-activity android-jetpack android-architecture-navigation

9
推荐指数
1
解决办法
1799
查看次数

如果我想以比市场上更高的minSDK发布更新,该怎么办?

我已经在市场上发布了一个应用程序,其中minSDK设置为4(Android 1.6),但现在我想发布一个更新,其功能在1.6中不可用,所以我需要更高的minSDK.

所以,我的问题是:运行1.6的用户是否会收到此更新的通知?...如果是,他们是否可以下载/安装它?

sdk android google-play

5
推荐指数
1
解决办法
666
查看次数