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