Cod*_*ody 6 android unit-testing coroutine kotlin kotlin-coroutines
当我在视图模型中添加协程延迟()时,代码的其余部分将不会被执行。
这是我的演示代码:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我得到断言结果:
java.lang.AssertionError:
Expected :1
Actual :0
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
您启动一个协程,该协程在设置为 1 之前暂停 1 秒。data
您的测试只是调用doSomething
,但不会等到data
实际设置为止。如果您在测试中添加另一个更长的delay
,它将起作用:
@Test
fun coroutineDelay() = runBlocking {
...
viewModel.doSomething()
delay(1100)
...
}
Run Code Online (Sandbox Code Playgroud)
您还可以让协程返回一个Deferred
您可以等待的对象:
fun doSomething(): Deferred<Unit> {
return async {
delay(1000)
data = 1
}
}
Run Code Online (Sandbox Code Playgroud)
无需await
再延迟您的代码:
val model = SimpleViewModel()
model.doSomething().await()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5405 次 |
最近记录: |