【发布时间】:2018-01-11 10:40:12
【问题描述】:
我最近开始在我的 Android 项目中使用 kotlin 协程,但我遇到了一些问题。许多人会称之为代码异味。
我正在使用 MVP 架构,其中协程在我的 Presenter 中启动,如下所示:
// WorklistPresenter.kt
...
override fun loadWorklist() {
...
launchAsync { mViewModel.getWorklist() }
...
launchAsync函数是这样实现的(在我的 WorklistPresenter 类扩展的 BasePresenter 类中):
@Synchronized
protected fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
return launch(UI) { block() }
}
问题在于我使用了一个依赖于 Android 框架的 UI 协程上下文。如果不遇到ViewRootImpl$CalledFromWrongThreadException,我无法将其更改为另一个协程上下文。为了能够对此进行单元测试,我创建了一个 BasePresenter 的副本,其中包含 launchAsync 的不同实现:
protected fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
runBlocking { block() }
return mock<Job>()
}
对我来说这是一个问题,因为现在我的 BasePresenter 必须在两个地方进行维护。所以我的问题是。如何更改我的实现以支持简单的测试?
【问题讨论】:
标签: android unit-testing kotlin kotlinx.coroutines