【问题标题】:How would one unit test api call method (rxjava+retrofit)?一个单元测试 api 调用方法(rxjava+retrofit)如何?
【发布时间】:2019-05-08 07:30:50
【问题描述】:

我正在尝试对使用改造和 rxjava 进行的 api 调用进行单元测试。 为了做到这一点,我正在模拟 api 调用对象,但 api 调用订阅者不会触发其 onNext 方法。

ApiCallsTest.java:

//自定义对象替换api调用响应对象

Observable<FastRechargeClass[]> apiObservable = Observable.just(fastRechargeList);
InterfaceAPI api = mock(InterfaceAPI.class);
when(retrofitApi.getApiInterface(context)).thenReturn(api);        when(api.getLatestTransactions("token")).thenReturn(apiObservable);
apiCalls.getLatestTransactions("token",context);

ApiCalls.java:

public void getLatestTransactions(String token, final Context context) {
        String methodName = "getLatestTransactions";

        InterfaceAPI api = retrofitApi.getApiInterface(context);
        Observable<FastRechargeClass[]> call = api.getLatestTransactions(token);
        call.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Observer<FastRechargeClass[]>() {
            @Override
            public void onSubscribe(Disposable d) {
                WriteLog.print("onSubscribe");
            }

            @Override
            public void onNext(FastRechargeClass[] fastRechargeClasses) {
                fastRechargeManager.runUpdateFastRechargeDb(fastRechargeClasses);
            }

            @Override
            public void onError(Throwable e) {
                logOnFailureRequests(methodName, e.getMessage());
            }

            @Override
            public void onComplete() {
            }
        });
    }

When running test

onSubscribe is being called and it stops

【问题讨论】:

    标签: unit-testing retrofit2 rx-android


    【解决方案1】:

    您需要手动触发事件发射。为此,您需要调用方法

    .blockingFirst() 或者 .blockingGet()

    取决于您使用的可观察类型。 所以你必须添加

    call.blockingGet()
    

    在 getLatestTransactions 方法的末尾或此方法应返回已创建的 observable 并在测试方法中调用阻塞 get。

    【讨论】:

    • 您的评论非常有用,为了让观察者调用 onNext 我不得不更改 call.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Observer() {...} to call.subscribeOn(Schedulers.io()).subscribe(new Observer() {...}。我猜这与线程管理有关。
    • @PanduruIonut Right ;)
    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多