我正在android应用中设置单元测试。我在模拟登录调用返回一个可完成的存储库:
row_number
成功案例适用于以下情况:
interface UserRepository {
fun login(params: Params): Completable
}
但是,我在模拟错误情况时遇到了麻烦。 调用用户存储库的viewModel设置如下:
val answer = Answer {
**custom assertions**
return@Answer Completable.complete()
}
whenever(userRepository.login(any())).thenAnswer(answer)
错误解析器是一个处理throwable的对象:
fun makeLoginCall(email: String, password: String){
val params = Params(email, password)
userRepository(params).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(::onSuccess, ::onError)
}
private fun onSuccess(){
displaySuccessfullLogin()
}
private fun onError(throwable: Throwable) {
val message = ErrorParser.getMessage(throwable)
displayError(message)
}
我对错误情况的测试:
object ErrorParser {
fun getMessage(throwable: Throwable): String {
var message = "Error"
if (throwable is HttpException) {
try {
val jsonError = Gson().fromJson(throwable.response().errorBody()?.string(), ErrorResponse::class.java)
message = jsonError.error.message
} catch (exception: Exception) {
Crashlytics.logException(exception)
}
} else {
Crashlytics.log(Log.getStackTraceString(throwable))
}
return message
}
}
问题是,我通过Completable.error(httpException)发送的Throwable通过ErrorParser对象运行,但是我无法从其中提取错误消息(它说它为null)。但是当我在测试类中运行相同的代码
(Gson()。fromJson(httpException.response()。errorBody()?. string(), ErrorResponse :: class.java).error.message)
它给了我正确的输出。随后,我的单元测试崩溃,因为它试图运行Crashlytics方法。
为什么在我的测试类中以及通过ErrorParser运行时HttpException有不同的值?我不应该使用Completable.error()吗? 创建HttpException时是否缺少某些内容?