【问题标题】:Schedulers.io() Throwing NullPointerException in my Unit TestsSchedulers.io() 在我的单元测试中抛出 NullPointerException
【发布时间】:2020-02-19 01:29:11
【问题描述】:

我正在尝试为下面使用 RxJava/RxKotlin 的 ViewModel 的方法创建 单元测试

fun doLogin(address: String, serial: String) {
    mLoading.value = true
    mCompositeDisposable.add(
        mRepository
            .doLogin(address, createJsonArray(serial, generatePinJSON()))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                onSuccess = { json ->
                    /** CODE **/
                },
                onError = { error ->
                    /** CODE **/
                }
            )
    )
}

但是当在测试方法中调用Schedulers.io()时,会抛出NullPointerException。

我尝试在下面使用这种方法:

https://medium.com/@dbottillo/how-to-unit-test-your-rxjava-code-in-kotlin-d239364687c9(创建规则)

https://medium.com/@PaulinaSadowska/writing-unit-tests-on-asynchronous-events-with-rxjava-and-rxkotlin-1616a27f69aa(将调度程序传递给 ViewModel)

在这两种方法中,都说在测试方法中使用 Schedulers.trampoline()。但它仍然抛出错误。

我没有办法了,不知道为什么会这样。

有人可以帮我吗?

谢谢。

【问题讨论】:

    标签: android unit-testing rx-java2 rx-kotlin2


    【解决方案1】:

    根据我的经验,你得到 null 是因为你没有嘲笑 mRepository.doLogin。尝试在测试函数的开头添加它

    whenever(mRepository.doLogin).thenReturn(...)
    

    【讨论】:

    • 感谢您的回复。但我已经嘲笑Mockito.when(mRepository.doLogin("", "")).thenReturn(Single.just(""))
    • 哦,我找到了问题所在。你是对的,我在嘲笑 mRepository.doLogin 错误。
    • 只是为了澄清:在上面发布的代码中有一个名为 createJsonArray 的方法。如果 mRepository.doLogin 的参数为空,它会创建一个“[]”字符串。因此,我需要将第二个参数作为“[]”传递,而不是用“”模拟这两个参数。像Mockito.when(mRepository.doLogin("", "[]")).thenReturn(Single.just("")) 这样的东西,它可以工作。
    • 很高兴我能帮上忙 :)
    • @TiagoAlmeida 学习阅读堆栈跟踪,这很容易,它会为您节省大量时间。
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多