问题描述
这样的问题,我通过测试通过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")
}