gpt4 book ai didi

android - 协程 - 单元测试 viewModelScope.launch 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:48 25 4
gpt4 key购买 nike

我正在为我的 viewModel 编写单元测试,但在执行测试时遇到了问题。 runBlocking { ... } block 实际上并没有等待内部代码完成,这让我感到惊讶。

测试失败,因为resultnull。为什么 runBlocking { ... } 不以阻塞方式在 ViewModel 中运行 launch block ?

我知道如果我将它转换为返回 Deferred 对象的 async 方法,那么我可以通过调用 await(),或者我可以返回一个 Job 并调用 join()但是,我想通过将我的 ViewModel 方法保留为 void 函数来做到这一点,有没有办法做到这一点?

// MyViewModel.kt

class MyViewModel(application: Application) : AndroidViewModel(application) {

val logic = Logic()
val myLiveData = MutableLiveData<Result>()

fun doSomething() {
viewModelScope.launch(MyDispatchers.Background) {
System.out.println("Calling work")
val result = logic.doWork()
System.out.println("Got result")
myLiveData.postValue(result)
System.out.println("Posted result")
}
}

private class Logic {
suspend fun doWork(): Result? {
return suspendCoroutine { cont ->
Network.getResultAsync(object : Callback<Result> {
override fun onSuccess(result: Result) {
cont.resume(result)
}

override fun onError(error: Throwable) {
cont.resumeWithException(error)
}
})
}
}
}
// MyViewModelTest.kt

@RunWith(RobolectricTestRunner::class)
class MyViewModelTest {

lateinit var viewModel: MyViewModel

@get:Rule
val rule: TestRule = InstantTaskExecutorRule()

@Before
fun init() {
viewModel = MyViewModel(ApplicationProvider.getApplicationContext())
}

@Test
fun testSomething() {
runBlocking {
System.out.println("Called doSomething")
viewModel.doSomething()
}
System.out.println("Getting result value")
val result = viewModel.myLiveData.value
System.out.println("Result value : $result")
assertNotNull(result) // Fails here
}
}

最佳答案

正如其他人提到的,runblocking 只是阻止在其范围内启动的协程,它与您的 viewModelScope 是分开的。您可以做的是注入(inject)您的 MyDispatchers.Background 并将 mainDispatcher 设置为使用 dispatchers.unconfined。

关于android - 协程 - 单元测试 viewModelScope.launch 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55765190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com