Тестирование Android-эспрессо SwipeRefreshLayout OnRefresh не было запущено при swipeDown - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь написать простой тест для pull для обновления как часть интеграционного тестирования. Я использую новейшие компоненты тестирования androidX и Robolectric. Я тестирую отдельный фрагмент, в который я вставляю издевательский презентатор.

Часть макета XML

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerTasks"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

Часть фрагмента

binding.refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                presenter.onRefresh();
            }
        });

Тест:

onView(withId(R.id.refreshLayout)).perform(swipeDown());
verify(presenter).onRefresh();

но тест не пройден, сообщение:

Требуется, но не вызывается: Presenter.onRefresh ();

Приложение прекрасно работает и обновляет вызовы Presenter.onRefresh (). Я также сделал отладку теста, и setOnRefreshListener был вызван, и это не пустое значение. Если я провожу тестирование с использованием специального средства сопоставления, чтобы проверить состояние проходов теста SwipeRefreshLayout.

onView(withId(R.id.refreshLayout)).check(matches(isRefreshing()));

1 Ответ

0 голосов
/ 02 мая 2019

В минувшие выходные я провел небольшое расследование, так как столкнулся с той же проблемой, и это беспокоило меня.Я также провел некоторое сравнение с тем, что происходит на устройстве, чтобы определить различия.

Внутренне androidx.swiperefreshlayout.widget.SwipeRefreshLayout имеет mRefreshListener, который будет работать при вызове onAnimationEnd.Затем AnimationEnd вызовет метод OnRefreshListener.onRefresh.

Этот слушатель анимации (mRefreshListener) передается в mCircleView (CircleImageView) и вызывается запуск анимации круга.

На устройствекогда вызывается метод view draw, он вызывает метод applyLegacyAnimation, который, в свою очередь, вызывает метод AnimationStartAnimationEnd, будет вызван метод onRefresh.

В Robolectric метод рисования View никогда не вызывается, поскольку элементы фактически не отрисовываются.Это означает, что анимация никогда не запустится, и, следовательно, метод onRefresh также не будет.

Мой вывод заключается в том, что в текущей версии Robolectric невозможно проверить, что onRefresh вызвано из-за ограничений реализации.Похоже, что в будущем планируется реалистичный рендеринг.

...