android - 使用 Dispatchers.IO 进行 Kotlin 协程测试

标签 android unit-testing kotlin kotlin-coroutines

所以也许有一个教程来解决这个问题,但我读过的没有一个为我解决这个问题。我有如下结构并正在尝试进行单元测试,但是当我去测试时,我总是无法说明 repo 方法 doSomthing()从未被调用。我最好的猜测是因为我在不同的上下文中启动了一个新的协程。那我该如何测试呢?

存储库

interface Repository {
    suspend fun doSomething(): String
}

查看模型
class ViewModel(val repo: Repository) {
    val liveData = MutableLiveData<String>()
    fun doSomething {
    //Do something here
        viewModelScope.launch(Dispatchers.IO) {
            val data = repo.doSomething()
            withContext(Dispatchers.Main) {
                liveData.value = data
            }
        }
    }
}

查看模型测试
class ViewModelTest {
    lateinit var viewModel: ViewModel
    lateinit var repo: Repository

    @Before
    fun setup() {
        Dispatchers.setMain(TestCoroutineDispatcher())
        repo = mock<Repository>()
        viewModel = ViewModel(repo)
    }

    @Test
    fun doSomething() = runBlockingTest {
        viewModel.doSomething()
        viewModel.liveData.test().awaitValue().assertValue {
            // assert something
        }
        verify(repo).doSomthing()
    }
}

最佳答案

根据谷歌:
enter image description here
Dispatchers应该注入(inject)你的ViewModels所以你可以正确地测试。您正在设置 TestCorotutineDispatcher通过 Dispatchers.setMain 作为主要调度员它控制了 MainDispatcher ,但您仍然无法控制通过 viewModelScope.launch(Dispatchers.IO) 启动的协程的执行。 .

通过Dispatcher通过构造函数将确保您的测试和生产代码使用相同的调度程序。

通常是 @Rule定义为:

  • 通过 Dispatchers.setMain 覆盖 MainDispatcher (就像你正在做的那样)
  • 使用 TestCoroutineDispatcher's拥有runBlockingTest()实际运行测试。

  • Here是关于去年 Android 开发峰会上发生的测试和协程的精彩演讲。

    here是这样的示例 @Rule . (无耻的插件。还有那个 repo 上的协程测试的例子)

    关于android - 使用 Dispatchers.IO 进行 Kotlin 协程测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620023/

    相关文章:

    android - 如何在 Swift 中将 protobuf 对象转换为 ByteArray 并使用 Base64 URL_SAFE 进行编码?

    gradle - 为什么我的 Kotlin Gradle 构建退出代码为 137?

    android - 在 Android NDK 中将标准输出重定向到 logcat

    使用相机后尝试编辑图片时,Android 新照片应用程序崩溃

    PHP 语言(单元)测试

    unit-testing - 在grails中进行单元测试时,如何模拟/ stub 特定的自定义验证器?

    kotlin - Kotlin DSL-具有多个接收器的通用lambda

    android - 为什么我们使用xml?

    android - 主题消息和设备 token 云功能推送通知之间的区别?

    unit-testing - 使用 Moq 验证私有(private)方法的执行