单元测试在调用演示者函数后出现 NullPointerException

Unit test have NullPointerException after calling function of presenter

这样的问题,我通过测试通过 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.invoke(LoginPresenter.kt:58)
at com.unikrn.esports.umode.ui.welcome.login.LoginPresenter$login.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")

}