android - 使用 RxLoader 进行 Espresso 测试

标签 android rx-java android-espresso

我有一个使用 RxLoader 在 Activity 创建时从服务器获取数据并填充 ListView 的 Activity 。我还有测试代码,它会在 ListView 填充后尝试点击它的第一行。

因为我正在使用 RxLoader,所以我必须为 Espresso 编写一个自定义的 IdlingResource。但是,问题是测试在我的 ListView 被填充之前完成(失败)。

这是我的 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;

}

问题是:当我运行测试代码时,方法“counter.decrementAndGet()”总是在我的 Activity 中的“onNext()”方法之前被调用。我的测试失败了,因为它希望填充 ListView 。

显然我做错了什么。但是我做错了什么?

更新:

这是一个更清晰的代码 fragment 来说明问题:

        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() 中的代码 fragment 在观察者的“onNext()”调用之前被调用。 finallyDo() 应该在“onNext()”之后调用吗?

最佳答案

Evan Tatarka 为我指出了正确的方向:https://github.com/evant/rxloader/issues/14

这是我的最终解决方案:

public class IdlingApiServiceWrapper implements IdlingResource {

public Observable<MyData> loadData() {
    counter.incrementAndGet();
    Observable<MyData> observable = api.loadData().finallyDo(new Action0() {
        @Override
        public void call() {
             new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    counter.decrementAndGet();
                    notifyIdle();
                }
            });
        }
    });
    return observable;
}

关于android - 使用 RxLoader 进行 Espresso 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410786/

相关文章:

Android Espresso 匹配具有不同色调的 BitmapDrawables

java - API 29 java android 中不推荐使用 getBitmap

javascript - 如何在 React Native 中的当前屏幕上显示 FlatList 时主动刷新它?

java - RxJava : Can a result be split into two different observables?

java - RxJava 条件中断链

Intellij Idea IDE 中的 Android Espresso 设置

android - 如何在使用 adb 时 chmod 二进制文件

c# - Xamarin 表单主详细信息页面未显示

android - Proguard : can't find referenced method 'android. app.DatePickerDialog 访问$000

android - 使用 Espresso 在底页中找不到 View