Как создать обработчик Generic Response для ошибки и проверки ответа с помощью модифицированных, rxjava и кинжалов

Я пытаюсь создать общую архитектуру для использования сложной структуры json следующим образом:

Формат Json

{ "type": "success", "code": "s-groups-0006", "description": "Index List successfully", "result": { "asOnDate": 1505457095278, "indexList": [ { "change": "22.35", "changePercent": "0.27", "isDefault": true, "isEditable": false } ] } 

}

Формат кинжала

 @Singleton fun provideGson(): Gson = GsonBuilder() .setLenient() // .registerTypeAdapter(BaseResponse::class.java, RestDeserializer<BaseResponse<T>>()) .create() 

Оставшиеся места для отдыха

  class RestDeserializer<T> : JsonDeserializer<T> { @Throws(JsonParseException::class) override fun deserialize(je: JsonElement, type: Type, jdc: JsonDeserializationContext): T? { val content = je.asJsonObject // Deserialize it. You use a new instance of Gson to avoid infinite recursion // to this deserializer return Gson().fromJson<T>(content, type) } 

}

Ошибка обратного вызова

 abstract class ErrorCallBack<T : BaseResponse<T>> : DisposableObserver<T>() { protected abstract fun onSuccess(t: T) override fun onNext(t: T) { //You can return StatusCodes of different cases from your API and handle it here. I usually include these cases on BaseResponse and iherit it from every Response onSuccess(t) } override fun onError(e: Throwable) { when (e) { is HttpException -> { val responseBody = (e).response().errorBody() responseBody?.let { Le("Error in call htttp exception") } } is SocketTimeoutException -> { // todo Le("Error in Socket time out") } is IOException -> { // todo Le("Error in IO Exception") } else -> { e.message?.let { // todo } } } } override fun onComplete() { } private fun getErrorMessage(responseBody: ResponseBody): String { return try { val jsonObject = JSONObject(responseBody.string()) jsonObject.getString("message") } catch (e: Exception) { e.message!! } } 

}

вместилище

  override fun getValidateUser(validateUser: ValidateUser): LiveData<ValidateUserResponse> { val mutableLiveData = MutableLiveData<ValidateUserResponse>() remoteServices.requestValidateUser(validateUser) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : ErrorCallBack<BaseResponse<ValidateUserResponse>>() { override fun onSuccess(t: BaseResponse<ValidateUserResponse>) { if (t.type == CommonContents.SUCCESS) { Ld("Success in validate user") mutableLiveData.value = transform(t) } else { Le("Validate User Error") } } }) return mutableLiveData } 

Класс данных

 data class BaseResponse<out T>( @SerializedName(CommonContents.TYPE) val type: String, @SerializedName(CommonContents.CODE) val Code: String, @SerializedName(CommonContents.DESCRIPTION) val Description: String, @SerializedName(CommonContents.RESULT)val result: T? = null) 

Это мои структуры, и я пытаюсь создать общую структуру, но сталкиваюсь с проблемой при вызове обратного вызова Error.

Пожалуйста, помогите мне, как это достичь. Могу ли я назвать общий метод внутри общего ответа?

  .subscribeWith(object : ErrorCallBack<BaseResponse<ValidateUserResponse>>() { 

Руководство по выполнению рабочего кодекса

Это мой путеводитель по созданию кода. Он основан на принципах развития, управляемого тестированием .

  1. Настройте среду тестирования вашего устройства в среде IDE. Лично я использовал JUnit 4 с Eclipse, но вы можете предпочесть JUnit 5 с IDE JetBrains.
  2. Напишите модульный тест для вашего ErrorCallback класса ErrorCallback . Заставьте это пройти. Затем напишите единичные тесты для каждого из методов, чтобы убедиться, что он ведет себя так, как вы ожидаете.
  3. Напишите единичные тесты, в которых ваш тестовый прибор является PublishSubject<BaseResponse<Integer>> для некоторого числа разных случаев: нормальные данные, последовательность нормальных данных, нормальные данные, за которыми следует ошибка, нормальные данные, за которыми следует завершение.
  4. Оттуда добавьте еще несколько тестов, чтобы вы могли проверить всю наблюдаемую цепочку.