Phương pháp Rxjava thử nghiệm Junit

Oct 04 2020

Tôi đã thử nghiệm các Rxjavaphương pháp nhiều lần mà không có vấn đề gì nhưng bây giờ tôi phải đối mặt với vấn đề này : Null pointer exceptiontrong subscribeOn(Schedulers.io())dòng này .

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

Tôi đã sử dụng Mockito whentrước đó nhưng tôi không biết tại sao sự cố này gây ra cho đến bây giờ và đây là testphương pháp của tôi :

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

Đây là của tôi 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()
    }
}

Trả lời

1 0xAliHn Oct 04 2020 at 10:49

Tôi nghĩ rằng bạn đang thử nghiệm điều này một cách sai lầm. Thử cái này:

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