相关疑难解决方法(0)

Kotlin 协程:在测试 Android Presenter 时切换上下文

我最近开始在我的 Android 项目中使用 kotlin 协程,但我遇到了一些问题。许多人将其称为代码异味。

我正在使用 MVP 架构,其中协程在我的演示者中启动,如下所示:

// WorklistPresenter.kt
...
override fun loadWorklist() {
    ...
    launchAsync { mViewModel.getWorklist() }
    ...
Run Code Online (Sandbox Code Playgroud)

launchAsync函数以这种方式实现(在我的 WorklistPresenter 类扩展的 BasePresenter 类中):

@Synchronized
protected fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
    return launch(UI) { block() }
}
Run Code Online (Sandbox Code Playgroud)

问题在于我使用的是依赖于 Android 框架的 UI 协程上下文。我无法将其更改为另一个协程上下文而不会遇到ViewRootImpl$CalledFromWrongThreadException. 为了能够对此进行单元测试,我创建了一个 BasePresenter 的副本,其中包含不同的实现launchAsync

protected fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
    runBlocking { block() }
    return mock<Job>()
}
Run Code Online (Sandbox Code Playgroud)

对我来说这是一个问题,因为现在我的 BasePresenter 必须在两个地方维护。所以我的问题是。如何更改我的实现以支持简单的测试?

android unit-testing kotlin kotlinx.coroutines

3
推荐指数
1
解决办法
2394
查看次数