我有一个活动,使用 RxLoader 在活动创建时从服务器获取数据,并填充列表视图。我还编写了测试代码,尝试在填充后单击列表视图的第一行。
由于我使用了 RxLoader,因此必须为 Espresso 编写自定义的 IdlingResource。然而,问题在于测试在我的列表视图填充之前就完成了(失败了)。
以下是我的 Activity 代码:
在上述代码中,finallyDo()中的代码片段在观察者的“onNext()”调用之前被调用。finallyDo()应该在“onNext()”之后被调用吗?
由于我使用了 RxLoader,因此必须为 Espresso 编写自定义的 IdlingResource。然而,问题在于测试在我的列表视图填充之前就完成了(失败了)。
以下是我的 Activity 代码:
RxLoaderManager.get(this).create(
"my_loader",
mRestService.loadData(),
new RxLoaderObserver<MyData>() {
@Override
public void onNext(MyData data) {
// populate listview with data here
...
}
});
这是我的IdlingResource实现代码:
public class IdlingApiServiceWrapper implements IdlingResource {
public Observable<MyData> loadData(){
counter.incrementAndGet();
Observable<MyData> observable = api.loadData().finallyDo(new Action0() {
@Override
public void call() {
counter.decrementAndGet();
notifyIdle();
}
});
return observable;
问题在于:当我运行测试代码时,在我的活动中“onNext()”方法之前总是调用“counter.decrementAndGet()”方法。我的测试失败,因为它期望listview被填充。
显然我做错了什么。但是我做错了什么?
更新:
这里有一个更清晰的代码片段来说明问题:
RxLoaderManager.get(this).create(
"my_loader",
myObservable.finallyDo(new Action0() {
@Override
public void call() {
//log
}
}),
new RxLoaderObserver<MyData>() {
@Override
public void onNext(MyData data) {
// do something here
}
}).start();
在上述代码中,finallyDo()中的代码片段在观察者的“onNext()”调用之前被调用。finallyDo()应该在“onNext()”之后被调用吗?