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

标签 android unit-testing rx-java rx-android mockk

我想用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/

相关文章:

java - 从 ArrayAdapter 扩展的 add(object) 未被覆盖。因此我无法称之为 mtd

python - 在 unittest tearDown 方法中断言是否可以?

c# - 是否可以在 Visual Studio c# 中指定测试顺序?

android - 是否需要退订

android - 谷歌 Agera 与 rxAndroid

android - AAPT : No resource found that matches the given name

java - 如何获取 Activity 时间表的颜色?

java - ImageButton findViewById 返回 null

unit-testing - 使用 Clojure 对 Java 进行单元测试

java - RxJava Eventbus 和错误处理