如何单元测试反应式调用错误情况,以及如何创建有效的HttpException以在单元测试时使用?

时间:2019-07-19 15:30:36

标签: android unit-testing kotlin junit

我正在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时是否缺少某些内容?

0 个答案:

没有答案