Junit测试Rxjava方法 [英] Junit test Rxjava method

查看:108
本文介绍了Junit测试Rxjava方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I tested the Rxjava methods many times without problem but now i faced with this problem : Null pointer exception in this subscribeOn(Schedulers.io()) line.

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

我之前使用过Mockito when,但是我不知道为什么这个问题会导致到现在,这是我的test方法:

I used Mockito when before it but i dont know why this problem cause until now and this is my test method :

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

推荐答案

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

I think you are testing this in wrong way. Try this:

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

这篇关于Junit测试Rxjava方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆