Android 未调用rxjava单元测试onError

Android 未调用rxjava单元测试onError,android,junit,mockito,rx-java,Android,Junit,Mockito,Rx Java,而调用了onCompleted,太奇怪了 方法: void load() { fetchData().subscribeOn(getIoScheduler()) .observeOn(getMainThreadScheduler()) .doOnError(throwable -> System.out.println("doOnError " + throwable)) .subscribe(new Subs

而调用了
onCompleted
,太奇怪了

方法:

void load() {
    fetchData().subscribeOn(getIoScheduler())
            .observeOn(getMainThreadScheduler())
            .doOnError(throwable -> System.out.println("doOnError " + throwable))
            .subscribe(new Subscriber<MyObject>() {
                @Override
                public void onCompleted() {
                    System.out.println("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("onError " + e);
                    handleError();
                }

                @Override
                public void onNext(MyObject myObject) {
                    handleSuccess(myObject);
                }
            });
 }
在控制台中,仅打印出
onCompleted

有趣的是,当我删除了测试成功场景的代码时,它按预期工作:

@Test
    public void load() {
            Mockito.doReturn(Schedulers.immediate())
                    .when(presenter)
                    .getMainThreadScheduler();
            Mockito.doReturn(Schedulers.immediate())
                    .when(presenter)
                    .getIoScheduler();

            // b) Error case
            Mockito.doReturn(Observable.error(new Exception("dummy exception"))).when(presenter)
                    .fetchData();

            presenter.load();

            Mockito.verify(presenter)
                    .handleError();
    }
产出:

onError
我错过了什么?我应该在测试错误场景之前重置一些东西吗


我使用的是RxJava 1.3.4,这里的关键可能是:

Mockito.reset(presenter);
调用删除与线程相关的任何模拟,因为它在测试方法开始时只设置一次,重置后不会再次设置模拟

老实说,测试成功和错误测试用例应该是两种不同的测试场景,可以忽略重置模拟

第一种情况:

@Test
public void loadSuccess() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    MyObject object = Mockito.mock(MyObject.class);
    Mockito.doReturn(Observable.just(object))
            .when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .fetchData();
    Mockito.verify(presenter)
            .handleSuccess(object);
}
@Test
public void loadError() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    Mockito.doReturn(Observable.error(new Exception("dummy exception"))).when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .handleError();
}
第二种(错误)情况:

@Test
public void loadSuccess() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    MyObject object = Mockito.mock(MyObject.class);
    Mockito.doReturn(Observable.just(object))
            .when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .fetchData();
    Mockito.verify(presenter)
            .handleSuccess(object);
}
@Test
public void loadError() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    Mockito.doReturn(Observable.error(new Exception("dummy exception"))).when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .handleError();
}

这里的关键可能是:

Mockito.reset(presenter);
调用删除与线程相关的任何模拟,因为它在测试方法开始时只设置一次,重置后不会再次设置模拟

老实说,测试成功和错误测试用例应该是两种不同的测试场景,可以忽略重置模拟

第一种情况:

@Test
public void loadSuccess() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    MyObject object = Mockito.mock(MyObject.class);
    Mockito.doReturn(Observable.just(object))
            .when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .fetchData();
    Mockito.verify(presenter)
            .handleSuccess(object);
}
@Test
public void loadError() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    Mockito.doReturn(Observable.error(new Exception("dummy exception"))).when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .handleError();
}
第二种(错误)情况:

@Test
public void loadSuccess() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    MyObject object = Mockito.mock(MyObject.class);
    Mockito.doReturn(Observable.just(object))
            .when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .fetchData();
    Mockito.verify(presenter)
            .handleSuccess(object);
}
@Test
public void loadError() {
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getMainThreadScheduler();
    Mockito.doReturn(Schedulers.immediate())
            .when(presenter)
            .getIoScheduler();
    Mockito.doReturn(Observable.error(new Exception("dummy exception"))).when(presenter)
            .fetchData();

    presenter.load();

    Mockito.verify(presenter)
            .handleError();
}