相关疑难解决方法(0)

如何测试启动 viewModelScope 协程的 ViewModel 函数?安卓科特林

我\xc2\xb4m试图找出在函数成员上测试这种类型的最简单方法,我\xc2\xb4见过更复杂的情况,例如协程 - 单元测试 viewModelScope.launch 方法,但没有\xc2\xb4t解决

\n
\n

ListScreenViewModel.kt

\n
\n
@HiltViewModel\nclass ListScreenViewModel @Inject constructor(): ViewModel() {\n\n    private var _itemsNumber = mutableStateOf(0)\n\n    private var _testList = mutableStateOf(listOf<String>())\n    val testList = _testList\n\n    fun addItem() {\n        viewModelScope.launch {\n            _itemsNumber.value++\n            _testList.value += (\n                "Item ${_itemsNumber.value}"\n                )\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

ListScreenViewModelTest.kt

\n
\n
class ListScreenViewModelTest{\n\n    private lateinit var viewModel: ListScreenViewModel\n\n    @Before\n    fun setup(){\n        viewModel = ListScreenViewModel()\n    }\n\n    @Test\n    fun `add an item to the list of items`(){\n        val numberOfItems = viewModel.testList.value.size\n        viewModel.addItem()\n …
Run Code Online (Sandbox Code Playgroud)

android unit-testing viewmodel kotlin kotlin-coroutines

19
推荐指数
1
解决办法
2万
查看次数

如何使用 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
查看次数