当协程包含协程延迟时,如何对协程进行单元测试?

2024-03-07

当我在视图模型中添加协程延迟()时,代码的其余部分将不会被执行。

这是我的演示代码:

class SimpleViewModel : ViewModel(), CoroutineScope {

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Unconfined

    var data = 0

    fun doSomething() {
        launch {
            delay(1000)
            data = 1
        }
    }
}

class ScopedViewModelTest {

    @Test
    fun coroutineDelay() {
        // Arrange
        val viewModel = SimpleViewModel()

        // ActTes
        viewModel.doSomething()

        // Assert
        Assert.assertEquals(1, viewModel.data)
    }
}

我得到断言结果:

java.lang.AssertionError: 
Expected :1
Actual   :0

知道如何解决这个问题吗?


您启动一个协程,在设置之前暂停 1 秒data1. 你的测试只是调用doSomething但并没有等到data实际上正在设置中。如果再加一个更长的delay,测试一下它是否有效:

@Test     
fun coroutineDelay() = runBlocking {
    ...
    viewModel.doSomething()
    delay(1100)
    ...
}

您还可以使协程返回Deferred您可以等待:

fun doSomething(): Deferred<Unit> {
    return async {
        delay(1000)
        data = 1
    }
}

With await无需再延迟您的代码:

val model = SimpleViewModel()
model.doSomething().await()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当协程包含协程延迟时,如何对协程进行单元测试? 的相关文章

随机推荐