相关疑难解决方法(0)

如何使用 Kotlin 协程为 Android 单元测试注入 viewModelScope?

问题

  1. viewModelScope使用 Kotlin 协程为 Android 单元测试注入的最佳策略是什么?

  2. 当 CoroutineScope 被注入到 ViewModel 进行单元测试时,flowOn即使在生产代码中不需要CoroutineDispatcher 也应该注入和定义 using吗?

flowOn在此用例中,生产代码中不需要,因为 RetrofitDispatchers.IOSomeRepository.kt 中处理线程,并在默认情况下viewModelScope返回数据Dispathers.Main

预期的

对保存在 Kotlin Flow 值中的 Android 的 ViewModel 视图状态值运行单元测试。

观察到的

带有主调度程序的模块未能初始化。对于测试,可以使用 kotlinx-coroutines-test 模块中的 Dispatchers.setMain

单元测试在 CoroutineScope 被硬编码的第一次出现时失败。viewModelScope被利用,以便启动的协程将维护 ViewModel 的生命周期。但是,它viewModelScope是从 ViewModel 内部创建的,与可以在 ViewModel 外部定义并作为参数传入的 CoroutineDispatcher 相比,这使得注入更加复杂。

执行

SomeViewModel.kt

fun bindIntents(view: FeedView) {
    view.initStateIntent().onEach {
        initState(view)
    }.launchIn(viewModelScope)        
}
Run Code Online (Sandbox Code Playgroud)

SomeTest.kt

@ExperimentalCoroutinesApi
class SomeTest : BeforeAllCallback, AfterAllCallback {

    private val testDispatcher = …
Run Code Online (Sandbox Code Playgroud)

junit android kotlin kotlin-coroutines kotlin-flow

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

标签 统计

android ×1

junit ×1

kotlin ×1

kotlin-coroutines ×1

kotlin-flow ×1