我正在使用MVP架構來構建我的應用程序。我的演示者調用一個DataManager,負責從網絡或數據庫獲取數據。當我使用RxJava時,我訂閱了Presenter中的Observers並將適當的狀態傳遞給UI。我的服務層有Android上下文,它也會創建一個我自己類型的異常,它也引用了上下文。如何在投擲異常內模擬Crashlytics靜態方法
if (isNetworkConnected()) {
final Call<ServiceResponse<AppVersion>> call = mService.getAppVersion();
try {
final Response<ServiceResponse<AppVersion>> response = call.execute();
if (response.isSuccessful()) {
final ServiceResponse<AppVersion> serviceResponse = response.body(); response.body();
if (serviceResponse.isSuccess()) {
subscriber.onNext(serviceResponse.getData());
} else {
subscriber.onError(new CustomException(mContext, response.code(), response.message(), serviceResponse.getErrorList()));
}
} else {
subscriber.onError(new CustomException(mContext, response.code(), response.message(), response.errorBody().string()));
}
} catch (IOException e) {
e.printStackTrace();
subscriber.onError(e);
} finally {
subscriber.onCompleted();
}
} else {
subscriber.onError(new NoInternetException());
}
我的CustomException還將崩潰記錄在Crashlytics中。當我單元測試這段代碼時,Crashlytics沒有初始化異常。所以我需要模擬Crashlytics的靜態方法logException
。但是,作爲主持人不接受這個對象,我該如何傳遞這個模擬對象呢?
public staticErrorType getErrorType(Throwable throwable) {
//409: Not handled as its a conflict response code and comes in PUT/POST
if (throwable instanceof IOException) {
return ErrorType.NO_INTERNET;
} else if (throwable instanceof CustomException) {
final int errorCode = ((CustomException) throwable).mErrorCode;
if (errorCode == 404) {
return ErrorType.NOT_FOUND;
} else if (errorCode == 401) {
return ErrorType.UNAUTORISED;
} else if (errorCode == 403) {
return ErrorType.FORBIDDEN;
} else if (errorCode == 500 || errorCode == 502) {
return ErrorType.NO_SERVER_TRY_AGAIN;
} else if (errorCode > 500 && errorCode < 599) {
return ErrorType.NO_SERVER_TRY_LATER;
} else if (errorCode == 1000) {
return ErrorType.NO_COURSE_ENROLLED;
} else if (errorCode == 1001) {
return ErrorType.NO_COURSE_STARTED;
}
}
if (throwable != null) {
Crashlytics.logException(throwable);
}
return ErrorType.SOME_THING_WENT_WRONG;
}
這聽起來像是你的類的設計問題。 CustomException本身不應該記錄到Crashlyrics。相反,如果有必要,應該由訂戶負責記錄。 –
@DavidRawson因此自定義異常應該由其他人訂閱,或者我應該將自定義記錄器類傳遞給異常,將異常記錄到任何平臺上,例如Crashlytics,並將其用於測試? –
感謝您的編輯 - 讓問題更清晰。一個好的解決方案是使用包裝類來包裝Crashlytics中的靜態方法。然後傳入包裝類作爲訂閱者的依賴關係。看[這個答案](http:// stackoverflow。com/a/29841824/5241933) –