Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ") 查看。uuu showFullScreenMessage(“我找到了很棒的”+大小+“地点记录”。) } System.out.println(“onNext()”) } 覆盖有趣的错误(e:可丢弃){ System.out.println(“onError()”) //e、 printStackTrace() 视图。_uhideloading() if(例外情况util.isNoNetworkException(e)){ 查看。uuu showFullScreenMessage(“很遗憾,无法连接到网络以获取位置列表。”) }否则{ 查看。uu showFullScreenMessage(“哦,出了点问题。[”+e.localizedMessage+“])) } 这个.dispose() } 覆盖有趣的onComplete(){ 这个.dispose() //System.out.printf(“onComplete()”) } }) } private fun\u getEventCompletionObserver():DisposableObserver{ 返回对象:DisposableObserver(){ 覆盖下一步(任务类型:字符串){ //_日志(String.format(“onNext%s任务”,任务类型)) } 覆盖有趣的错误(e:可丢弃){ //_日志(String.format(“当任务超时”)) //Timber.e(e,“超时演示例外”) } 覆盖有趣的onComplete(){ //_日志(String.format(“任务已完成”)) } } }}_Java_Android_Unit Testing_Retrofit2_Rx Java2 - Fatal编程技术网

Java ") 查看。uuu showFullScreenMessage(“我找到了很棒的”+大小+“地点记录”。) } System.out.println(“onNext()”) } 覆盖有趣的错误(e:可丢弃){ System.out.println(“onError()”) //e、 printStackTrace() 视图。_uhideloading() if(例外情况util.isNoNetworkException(e)){ 查看。uuu showFullScreenMessage(“很遗憾,无法连接到网络以获取位置列表。”) }否则{ 查看。uu showFullScreenMessage(“哦,出了点问题。[”+e.localizedMessage+“])) } 这个.dispose() } 覆盖有趣的onComplete(){ 这个.dispose() //System.out.printf(“onComplete()”) } }) } private fun\u getEventCompletionObserver():DisposableObserver{ 返回对象:DisposableObserver(){ 覆盖下一步(任务类型:字符串){ //_日志(String.format(“onNext%s任务”,任务类型)) } 覆盖有趣的错误(e:可丢弃){ //_日志(String.format(“当任务超时”)) //Timber.e(e,“超时演示例外”) } 覆盖有趣的onComplete(){ //_日志(String.format(“任务已完成”)) } } }}

Java ") 查看。uuu showFullScreenMessage(“我找到了很棒的”+大小+“地点记录”。) } System.out.println(“onNext()”) } 覆盖有趣的错误(e:可丢弃){ System.out.println(“onError()”) //e、 printStackTrace() 视图。_uhideloading() if(例外情况util.isNoNetworkException(e)){ 查看。uuu showFullScreenMessage(“很遗憾,无法连接到网络以获取位置列表。”) }否则{ 查看。uu showFullScreenMessage(“哦,出了点问题。[”+e.localizedMessage+“])) } 这个.dispose() } 覆盖有趣的onComplete(){ 这个.dispose() //System.out.printf(“onComplete()”) } }) } private fun\u getEventCompletionObserver():DisposableObserver{ 返回对象:DisposableObserver(){ 覆盖下一步(任务类型:字符串){ //_日志(String.format(“onNext%s任务”,任务类型)) } 覆盖有趣的错误(e:可丢弃){ //_日志(String.format(“当任务超时”)) //Timber.e(e,“超时演示例外”) } 覆盖有趣的onComplete(){ //_日志(String.format(“任务已完成”)) } } }},java,android,unit-testing,retrofit2,rx-java2,Java,Android,Unit Testing,Retrofit2,Rx Java2,加载例外位置列表()的问题 我不知道为什么代码没有进入演示者的onError()。 如果我有以下错误,请纠正我,但这是我的想法: a-`apimager.getPlacesPagedObservable(“,0)`observable本身会引发一个异常,这就是为什么“.subscribe()`无法发生/继续,并且不会调用observable的方法的原因, b-只有当observable中的操作遇到类似JSONException的异常时,它才会转到onError() 对于loadExc

加载例外位置列表()的问题

  • 我不知道为什么代码没有进入演示者的
    onError()
    。 如果我有以下错误,请纠正我,但这是我的想法:
    • a-`apimager.getPlacesPagedObservable(“,0)`observable本身会引发一个异常,这就是为什么“.subscribe()`无法发生/继续,并且不会调用observable的方法的原因,
    • b-只有当observable中的操作遇到类似JSONException的异常时,它才会转到onError()
  • 对于
    loadExceptionPlaceTest()
    我认为上面的1b是让演示者的
    onError()
    被调用并通过测试的方法。这是正确的吗?如果是在测试中如何做的。如果不是,你们能指出我遗漏了什么或做错了什么吗
  • 我将把它留在这里,以供将来参考,并能够详细阐述一点,即使我在评论中已经回答了

    您试图实现的是将流放入
    onError
    流中。不幸的是,通过如下方式模拟它:

    open class RestApiManager: RestApiInterface{
    var api: RestApiInterface
        internal set
    internal var retrofit: Retrofit
    init {
        val logging = HttpLoggingInterceptor()
        // set your desired log level
        logging.setLevel(HttpLoggingInterceptor.Level.BODY)
    
        val client = okhttp3.OkHttpClient().newBuilder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(LoggingInterceptor())  
                .build()
    
    
        retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//very important for RXJAVA and retrofit
                .build()
        api = retrofit.create(RestApiInterface::class.java)
    }
    override fun getPlacesPagedObservable(accessToken: String?, page: Int?): Observable<PlacesWrapper> {
        //return throw Exception("sorry2")
        return api.getPlacesPagedObservable(
                accessToken,
                page)
    }
    }
    
    Mockito.`when`(apiManager.getPlacesPagedObservable(
                       Mockito.anyString(), Mockito.anyInt()))
                               .thenThrow(Exception(EXCEPTION_MESSAGE1))
    
    实际上,您正在告诉Mockito以一种方式设置您的模拟,即只需调用
    apimager.getPlacesPagedObservable(anystring,anystring)
    就会引发异常

    确实,在Rx流中引发异常会导致整个流停止并最终进入
    onError
    方法。但是,这正是您使用的方法的问题。引发异常时,您不在流中

    相反,您要做的是告诉Mockito,一旦调用
    apimager.getPlacesPagedObservable(anystring,anystring)
    您想要返回一个流,该流将在
    onError
    中结束。这可以通过
    Observable.error()轻松实现,如下所示:

    Mockito.`when`(apiManager.getPlacesPagedObservable(
                   Mockito.a‌​nyString(), Mockito.anyInt()))
                        .thenReturn(Observable.error(
                                    Exception(EXCEPTION_MESSAGE1)))
    
    (您可能需要在此部分中添加一些类型信息
    Observable.error()
    ,您可能还需要使用其他类型信息,而不是Observable-single、completable等。)


    上面的模拟将告诉Mockito设置你的模拟以返回一个可观察的,一旦订阅就会出错。这将反过来使你的订阅者直接进入
    onError
    流,并出现指定的异常。

    你是否尝试过
    Mockito.`when`(apimager.getPlacesPagedObservable(Mockito.anyString()),Mockito.anyInt())。然后返回(Observable.error())
    ?我认为,按照您的方式,异常被抛出Rx流之外。因此,
    onError
    不会发生。这就像说,当您调用此方法时抛出此异常,但您想要的是:当您调用此方法时,返回一个可观察到的错误,并将流放入
    onError
    。您可能需要点击
    Observable.error()
    部分返回您需要的类型。@Fred感谢您的确认。异常被抛出Rx流之外是正确的。
    Observable.error()
    是我想要的答案。我在测试Rx错误路径和Observable时遇到了同样的问题。error(exception)是我的解决方案。谢谢
       class PlacesPresenterImpl
    constructor(var view: PlacesView, var context: Context, var savedInstanceState:Bundle?, var mainThread: Scheduler)
    : BasePresenter(), BasePresenterInterface, PlacesPresenterInterface {
    
    lateinit var apiManager:RestApiInterface
    var placeListRequest: Disposable? = null
    
    
    override fun __firstInit() {
        apiManager = RestApiManager()
    }
    
    override fun __init(context: Context, savedInstanceState: Bundle, view: BaseView?) {
        this.view = view as PlacesView
        if (__isFirstTimeLoad())
            __firstInit()
    }
    
    
    override fun __destroy() {
        placeListRequest?.dispose()
    }
    
    override fun __populate() {
        _callPlacesApi()
    }
    
    
    override fun _callPlacesApi() {
        view.__showLoading()
        apiManager.getPlacesPagedObservable("", 0)
                .subscribeOn(Schedulers.io())
                .observeOn(mainThread)
                .subscribe (object : DisposableObserver<PlacesWrapper>() {
                    override fun onNext(placesWrapper: PlacesWrapper) {
                        placesWrapper?.let {
                            val size = placesWrapper.place?.size
                            view.__hideLoading()
                            view._showList()
                            System.out.println("Great I found " + size + " records of places.")
                            view.__showFullScreenMessage("Great I found " + size + " records of places.")
                        }
                        System.out.println("onNext()")
                    }
    
                    override fun onError(e: Throwable) {
                        System.out.println("onError()")
                        //e.printStackTrace()
                        view.__hideLoading()
                        if (ExceptionsUtil.isNoNetworkException(e)){
                            view.__showFullScreenMessage("So sad, can not connect to network to get place list.")
                        }else{
                            view.__showFullScreenMessage("Oops, something went wrong. ["+e.localizedMessage+"]")
                        }
    
                        this.dispose()
                    }
    
                    override fun onComplete() {
                        this.dispose()
                        //System.out.printf("onComplete()")
                    }
                })
    
    
    }
    
    private fun _getEventCompletionObserver(): DisposableObserver<String> {
        return object : DisposableObserver<String>() {
            override fun onNext(taskType: String) {
                //_log(String.format("onNext %s task", taskType))
            }
    
            override fun onError(e: Throwable) {
                //_log(String.format("Dang a task timeout"))
                //Timber.e(e, "Timeout Demo exception")
            }
    
            override fun onComplete() {
                //_log(String.format("task was completed"))
            }
        }
    }}
    
    Mockito.`when`(apiManager.getPlacesPagedObservable(
                       Mockito.anyString(), Mockito.anyInt()))
                               .thenThrow(Exception(EXCEPTION_MESSAGE1))
    
    Mockito.`when`(apiManager.getPlacesPagedObservable(
                   Mockito.a‌​nyString(), Mockito.anyInt()))
                        .thenReturn(Observable.error(
                                    Exception(EXCEPTION_MESSAGE1)))