kotlin 如何使用Mockk测试Observable的订阅调用?

8ehkhllq  于 2023-01-21  发布在  Kotlin
关注(0)|答案(1)|浏览(171)

我的ViewModel中有一个函数,我在其中订阅了一些更新,我想编写一个测试,检查在订阅被触发后,特定的函数是否从订阅中调用。
下面是函数的外观:

fun subscribeToTablesUpdates() {
    dataManager.getTablesList()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { tablesList ->
            updateTablesState(tablesList)
        }
}

这是我写的测试

@Test
fun subscribeToTablesListTest() {
    val mockedTablesList = mockk<List<Table>()

    every {
        viewModel.dataManager.getTablesList()
    } returns Observable.just(mockedTablesList)

    viewModel.subscribeToTablesUpdates()

    verify {
        viewModel.updateTablesState(mockedTablesList)
    }
}

问题是,我收到Assert异常没有任何其他信息,我不知道如何修复。
编辑1:subscribeToTableUpdates()从ViewModel的init块调用。

q5iwbnjs

q5iwbnjs1#

所以基本上测试本身是正确的,但是存在链接问题。由于VM的函数是从init块调用的,因此订阅只发生了一次,这就造成了这样一种情况:当我模拟数据服务时,观察者已经订阅了另一个服务。由于init块只调用了一次,则无法改变对该观察者的数据服务的实现。
经过这一切调查之后,我成功地忘记了一件事,这件事又出现在我的脑海里:提取构造函数的每个外部依赖项,这样你就可以用它来代替测试,而不会出现这样的问题。

相关问题