调用演示者函数后,单元测试具有NullPointerException

问题描述

这样的问题,我通过测试通过RX检查了请求,然后尝试检查响应,但是在响应中,如果成功,则也使用RX调用一个方法,并且在.observeOn(mainThreadScheduler)中行我得到java.lang.NullPointerException。测试本身通过了,如何清除错误?谢谢。

我测试过的功能

 fun login(email: String,password: String) {
    adddisposable(
        loginUseCase.run(
            LoginRequest(
                email,password,"en"
            )
        )
            .observeOn(mainThreadScheduler)
            .subscribeOn(backgroundScheduler)
            .subscribe(::onLoginSuccess,::onLoginError)
    )
}
 private fun onLoginSuccess(loginResponse: LoginResponse) {
    with(loginResponse) {
        if (isError) {
            getView()?.showErrorMessage(message)
        } else {
            deviceSharedPreferences.setSessionId(sessionId)
            deviceSharedPreferences.setUserId(userId)
            getUserData()
        }
    }
}

成功调用以及在.observeOn行中获得NPE的地方调用功能

    override fun getUserData() {
    adddisposable(
        getUserDataUseCase.run()
            .observeOn(mainThreadScheduler)
            .subscribeOn(backgroundScheduler)
            .subscribe(this::onGetUserDataSuccess,Throwable::printstacktrace)
    )
}

测试:

  @Before
fun setUp() {
    presenter = LoginPresenter(
        Schedulers.trampoline(),Schedulers.trampoline(),loginUseCase,router,deviceSharedPreferences,getUserDataUseCase,resourceUtils,getUserProfileUseCase
    )
    presenter.setView(view)
}

    @Test
fun login() {

    given(loginUseCase.run(LoginUseCase.LoginRequest(USER_LOGIN,USER_PASSWORD,"en")))
        .willReturn(Single.just(LoginResponse(
            false,"ok","id","name","userId")))

    presenter.login(USER_LOGIN,USER_PASSWORD)

    verify(deviceSharedPreferences,atLeastOnce()).setSessionId("id")

}

错误

     java.lang.NullPointerException
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.getUserData(LoginPresenter.kt:81)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.onLoginSuccess(LoginPresenter.kt:69)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.access$onLoginSuccess(LoginPresenter.kt:17)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter$login$1.invoke(LoginPresenter.kt:58)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter$login$1.invoke(LoginPresenter.kt:17)

我也发现:

Exception in thread "main" java.lang.NullPointerException
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.getUserData(LoginPresenter.kt:81)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.onLoginSuccess(LoginPresenter.kt:69)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter.access$onLoginSuccess(LoginPresenter.kt:17)

解决方法

我认为我认为解决方案不是更好,如果您有更好的表现,我会很乐意看到的。)

我只添加第一名之后的第二名

@Test
fun login() {

given(loginUseCase.run(LoginUseCase.LoginRequest(USER_LOGIN,USER_PASSWORD,"en")))
    .willReturn(Single.just(LoginResponse(
        false,"ok","id","name","userId")))

given(getUserDataUseCase.run())
        .willReturn(
            Single.just(
                UserData(
                    1,false,"",isLoggedIn = true,canBet = true,isDisabled = false,canBetSkill = true,isVerifiedOrPending = false
                )
            )
        )

presenter.login(USER_LOGIN,USER_PASSWORD)

verify(deviceSharedPreferences,atLeastOnce()).setSessionId("id")

}