Junit测试Rxjava方法

Junit test Rxjava method

我多次测试 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()
    }
}

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

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