【问题标题】:How to mock and test RxJava/RxAndroid with Mockk?如何使用 Mockk 模拟和测试 RxJava/RxAndroid?
【发布时间】:2018-06-25 09:26:54
【问题描述】:

我想用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)
    }
}

我得到了错误: Verification failed: call 2 of 3: IView(#2).hideProgress()) was not called.

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

【问题讨论】:

  • 不确定我是否理解。如果是bug,请在这里提交github issue:github.com/mockk/mockk/issues/new否则就等有RxJava经验的人出现吧。
  • 我用spky而不是mockk修复了它,谢谢!

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


【解决方案1】:

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)
    }
}

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 2020-01-29
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2019-12-02
    • 2019-03-15
    相关资源
    最近更新 更多