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