gpt4 book ai didi

android - 如何使用 Mockk 模拟和测试 RxJava/RxAndroid?

转载 作者:行者123 更新时间:2023-12-05 00:16:54 26 4
gpt4 key购买 nike

我想用Observable模拟和测试我的Presenter,但我不知道该怎么做,代码的主要部分如下:

//in my presenter:
override fun loadData(){
this.disposable?.dispose()
this.disposable =
Observable.create<List<Note>> {emitter->
this.notesRepository.getNotes {notes->
emitter.onNext(notes)
}
}
.doOnSubscribe {
this.view.showProgress()
}
.subscribe {
this.view.hideProgress()
this.view.displayNotes(it)
}
}

//in test:
@Test
fun load_notes_from_repository_and_display(){
val loadCallback = slot<(List<Note>)->Unit>();
every {
notesRepository.getNotes(capture(loadCallback))
} answers {
//Observable.just(FAKE_DATA)
loadCallback.invoke(FAKE_DATA)
}
notesListPresenter.loadData()
verifySequence {
notesListView.showProgress()
notesListView.hideProgress()
notesListView.displayNotes(FAKE_DATA)
}
}

我收到错误:验证失败:调用第 2 个(共 3 个):未调用 IView(#2).hideProgress())。

那么,如何在 Android 单元测试中使用 Mockk 测试 Rx 的东西呢?提前致谢!

最佳答案

https://github.com/elye/demo_rxjava_manage_state添加RxImmediateSchedulerRule ,然后使用 spyk 而不是 mockk,它就可以工作了!

companion object
{
@ClassRule @JvmField
val schedulers = RxImmediateSchedulerRule()
}

@Test
fun load_notes_from_repository_and_display()
{
val loadCallback = slot<(List<Note>)->Unit>();
val notesRepo = spyk<INotesRepository>()
val notesView = spyk<INotesListContract.IView>()
every {
notesRepo.getNotes(capture(loadCallback))
} answers {
loadCallback.invoke(FAKE_DATA)
}

val noteList = NotesListPresenter(notesRepo, notesView)
noteList.loadData()

verifySequence {
notesView.showProgress()
notesView.hideProgress()
notesView.displayNotes(FAKE_DATA)
}
}

关于android - 如何使用 Mockk 模拟和测试 RxJava/RxAndroid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51020178/

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