所以也许有一个教程来解决这个问题,但我读过的没有一个为我解决这个问题。我有如下结构并正在尝试进行单元测试,但是当我去测试时,我总是无法说明 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()
}
}
最佳答案
根据谷歌:
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/