【问题标题】:Junit test Rxjava methodJunit测试Rxjava方法
【发布时间】:2020-10-04 08:17:15
【问题描述】:

我多次测试Rxjava 方法没有问题,但现在我遇到了这个问题Null pointer exception 在此 subscribeOn(Schedulers.io()) 行中。

 fun registerPhone(phoneNumber: String, nationalId: String) {
        val disposable =
            mRepository.getRegister(jsonObjectToRequestBody(phoneNumber, nationalId))
                .subscribeOn(Schedulers.io()) //NPE in this line
.
.
.
}

我之前使用过Mockitowhen,但直到现在我才知道为什么会出现这个问题,这是我的test 方法:

class ViewModelTest : BaseTest() {
    private val mResponseBody = ResponseBody.create(
        null, ""
    )
    private var mGson= Gson()
    private val mRequestBody = RequestBody.create(null, mGson.toJson(Register("123", "123")))
    .
    .
    .

    @Test
    fun registerPhone_success() {
        Mockito.`when`(mRepository.getRegister(mRequestBody)).thenReturn(
            Single.just(
                Response.success(mResponseBody)
            )
        )
        mViewModel.registerPhone("123", "123")
}
}

这是我的base test

open class BaseTest {
    @Before
    fun setUpClass() {
        RxJavaPlugins.reset()
        RxAndroidPlugins.reset()
        val immediate = object : Scheduler() {
            override fun scheduleDirect(run: Runnable, delay: Long, unit: TimeUnit): Disposable {

                return super.scheduleDirect(run, 0, unit)
            }

            override fun createWorker(): Worker {
                return ExecutorScheduler.ExecutorWorker(Executor { it.run() }, true)
            }
        }
        RxJavaPlugins.setInitIoSchedulerHandler { scheduler -> immediate }
        RxJavaPlugins.setInitComputationSchedulerHandler { scheduler -> immediate }
        RxJavaPlugins.setInitNewThreadSchedulerHandler { scheduler -> immediate }
        RxJavaPlugins.setInitSingleSchedulerHandler { scheduler -> immediate }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler -> immediate }

        RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
        RxJavaPlugins.setComputationSchedulerHandler { Schedulers.trampoline() }
        RxJavaPlugins.setNewThreadSchedulerHandler { Schedulers.trampoline() }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
    }

    @After
    fun tearDownClass() {
        RxJavaPlugins.reset()
        RxAndroidPlugins.reset()
    }
}

【问题讨论】:

    标签: android kotlin junit mockito rx-java


    【解决方案1】:

    我认为您正在以错误的方式进行测试。试试这个:

    class ViewModelTest : BaseTest() {
        private val mResponseBody = ResponseBody.create(
            null, ""
        )
        private var mGson= Gson()
    
        private val mRepository = mock()
    
    
        @Test
        fun registerPhone_success() {
            whenever(mRepository.getRegister(any())).thenReturn(
                Single.just(
                    Response.success(mResponseBody)
                )
            )
            mViewModel.registerPhone("123", "123")
    }
    }
    

    【讨论】:

    • 感谢您对我的回答:any() must not be null
    • 你在用import com.nhaarman.mockito_kotlin.any
    • 不,我没用过
    • 请使用它再试一次
    • 天啊,它有效,但如何?问题是什么?你能解释一下吗?
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2019-11-27
    • 2018-12-22
    相关资源
    最近更新 更多