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();
}