我有一个调用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 ->
Single.create { }
上,这表明我在处理单元测试时出现了问题。 - Arrowsomeval observer
应该是mTokenRepository.resetPassword(MOCK_EMAIL)
,因为这是你正在观察和尝试测试的东西,而不是其中的细节,即mApiInterfacePanda.resetPassword(MOCK_EMAIL)
。此外,删除Single.create { }
结构。这是响应式和回调样式之间的桥梁。你可以从repository.resetPassword()
函数中简单地返回mApiInterfacePanda.resetPassword(MOCK_EMAIL)
。我假设emitter.onSuccess()
没有被触发。 - denvercoder9