【发布时间】:2020-09-05 09:52:27
【问题描述】:
我有这个调用 Rest API 并将结果作为 Observable (Single) 返回的方法:
fun resetPassword(email: String): Single<ResetPassword> {
return Single.create { emitter ->
val subscription = mApiInterfacePanda.resetPassword(email)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({ resetPasswordResponse ->
when(resetPasswordResponse.code()) {
200 -> {
resetPasswordResponse?.body()?.let { resetPassword ->
emitter.onSuccess(resetPassword)
}
}
else -> emitter.onError(Exception("Server Error"))
}
}, { throwable ->
emitter.onError(throwable)
})
mCompositeDisposable.add(subscription)
}
}
单元测试:
@Test
fun resetPassword_200() {
val response = Response.success(200, sMockResetPasswordResponse)
Mockito.`when`(mApiInterfacePanda.resetPassword(Mockito.anyString()))
.thenReturn(Single.just(response))
mTokenRepository.resetPassword(MOCK_EMAIL)
val observer = mApiInterfacePanda.resetPassword(MOCK_EMAIL)
val testObserver = TestObserver.create<Response<ResetPassword>>()
observer.subscribe(testObserver)
testObserver.assertSubscribed()
testObserver.awaitCount(1)
testObserver.assertComplete()
testObserver.assertResult(response)
}
我的问题是只有这条线被覆盖,而其他线不会运行,这对我的总测试覆盖率有很大影响:
return Single.create { emitter ->
【问题讨论】:
-
@sonnet 感谢分享,但我搜索了互联网,也访问了一些 StackOverflow 页面,但我没有找到任何适合我的特殊情况的答案。
-
问题是没有得到更多的测试覆盖率还是上面的代码不起作用?
-
@sonnet 它通过了测试,线路覆盖仅在
Single.create { }上,它表明我处理单元测试的方式有问题。 -
您的
val observer应该是mTokenRepository.resetPassword(MOCK_EMAIL),因为这是您正在观察和尝试测试的东西,而不是其中的细节mApiInterfacePanda.resetPassword(MOCK_EMAIL)。此外,删除Single.create { }构造。这是反应式和回调风格之间的桥梁。您可以简单地从repository.resetPassword()函数返回mApiInterfacePanda.resetPassword(MOCK_EMAIL)。我假设emitter.onSuccess()没有被触发
标签: android unit-testing kotlin retrofit2 rx-java2