Модульный тест имеет исключение NullPointerException после вызова функции presenter

#android #unit-testing #kotlin #mockito #rx-java2

#Android #модульное тестирование #kotlin #mockito #rx-java2

Вопрос:

такая проблема, я проверяю запрос через 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()
        }
    }
}
  

Функция, которая вызывается при успехе и где я получаю NPE в строке .observeOn

     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)
  

Ответ №1:

Я нашел решение не лучше, я думаю, если у вас есть sme лучше, я хотел бы его увидеть)

Я просто добавляю второе значение после первого

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

}