单元测试在调用演示者函数后出现 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")
}
这样的问题,我通过测试通过 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")
}