我正在使用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) –