1

私は、アイテムを(オートコンプリートのように)検索しているときに表示されるリストビューをテストするためにEspressoを使用しています。リストビューは、ユーザーがSearchViewに何かを入力するまで表示されません。つまり、ユーザーがSearchViewに何かを入力したときにのみListViewをView.VISIBLEに設定します。android.support.test.espresso.PerformException:ビュー 'load adapter data'の実行中にエラーが発生しました

リストビューでテキストをクリックしようとするとこのエラーが発生します。 android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id:'。 onDataを使用しても機能しませんでした。

人工遅延は動作しますが、これは悪い習慣であるならば、それは私が試した何

などなどonDataなどのメソッドの目的を倒すように見えるので、私はわからないよ追加:

:私はこれらのStackOverflowの質問を読みますが、彼らは私の問題が解決しない

  • 私は人工的な遅延を導入する必要はありません。人工的な遅延を追加する

    public pickSuggestion(int index){ 
    
        /** artificial delay to allow list to appear. 
        This works but I shouldn't have to do this right? **/ 
    
        SystemClock.sleep(1000); 
    
        onData(anything()) 
         .inAdapterView(withId(R.id.list)) 
         .atPosition(index) 
         .onChildView(withId(R.id.mTextView)) 
         .perform(click()); 
    } 
    
  • 答えて

    2

    動作しますが、そのようなerrorが提供されるあなたのonDataハンドラなど

    などのメソッドの目的を倒すように見えるので、これは 練習が悪い場合、私はわかりませんよEspressoの制限があります。このフレームワークはUIスレッドで実行する必要があり、アイドル状態になるまで待機します。これは、ロードアダプタデータを待つ、しかしを待っていないリソースアイドリング取得

    チェック:http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/

    IdlingResource参考:https://developer.android.com/reference/android/support/test/espresso/IdlingResource.html

    IdlingResourceドキュメント:https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html

    CountingIdlingResource:https://developer.android.com/reference/android/support/test/espresso/idling/CountingIdlingResource.html

    SystemClock.sleep(1000)Thread.sleep(1000)のようなコードは、優れたデバイスがこの時間が必要ではなく、古いものはもっと必要です。したがって、コードは高速で柔軟性ではなく、薄れているかもしれません。

    解答は、データと時間を失うことなくテストを実行できるときにエスプレッソに伝えるために独自のEspresso IdlingResourceを作成することです。

    希望すると、これが役立ちます。

    0

    同じエラーメッセージが表示されるの「アダプタデータを読み込む」エラーが発生しましたが、これらの投稿からの回答はどれも私のために働いていませんでした。

    Testing RecyclerView if it has data with Espresso
    Espresso onData Error performing 'load adapter data' on view
    Espresso. Error performing 'load adapter data'

    私は、Android StudioでEspresso UI test recorderを使用して終了。 にアクセスし、トップドロップダウンメニューからを実行し、Record Espresso Testをクリックします。それはあなたが実行するデバイスを選択するように要求され、アプリケーションが起動されたら、実行するUIテストを手動で行い、必要に応じてアサーションを追加します。完了した場合は、OKを打つ。それはあなたのためのUIテストファイルを生成します。

    用に生成されたコードは、RecyclerViewの項目をクリックすると次のようになります。ここでの重労働はMatcherメソッドですchildAtPosition() テストの開始時に、10秒間スリープしてすべてがロードされていることを確認します。通常は10秒かかることはありませんが、おそらく2秒に短縮できます。代わりに、@piotrek1543のようなEspresso IdlingResourceを使用することが推奨されていますが、それはテストに対応するために生産コードに介入(試験固有のコードを混ぜる)を加える必要があります。

    @LargeTest 
    @RunWith(AndroidJUnit4.class) 
    public class MainActivityTest { 
    
        @Rule 
        public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class); 
    
        @Test 
        public void mainActivityTest() { 
         // Added a sleep statement to match the app's execution delay. 
         // The recommended way to handle such scenarios is to use Espresso idling resources: 
         // https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html 
         try { 
          Thread.sleep(10000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
    
         ViewInteraction recyclerView = onView(
           allOf(withId(R.id.recycler_view_list), 
             childAtPosition(
               withClassName(is("android.support.constraint.ConstraintLayout")), 
               0))); 
         recyclerView.perform(actionOnItemAtPosition(0, click())); 
        } 
    
        private static Matcher<View> childAtPosition(
          final Matcher<View> parentMatcher, final int position) { 
    
         return new TypeSafeMatcher<View>() { 
          @Override 
          public void describeTo(Description description) { 
           description.appendText("Child at position " + position + " in parent "); 
           parentMatcher.describeTo(description); 
          } 
    
          @Override 
          public boolean matchesSafely(View view) { 
           ViewParent parent = view.getParent(); 
           return parent instanceof ViewGroup && parentMatcher.matches(parent) 
             && view.equals(((ViewGroup) parent).getChildAt(position)); 
          } 
         }; 
        } 
    } 
    

    注:エスプレッソUIテストレコーダーによって生成されたコードは、どちらか完璧ではない、それはほとんどの時間のために働くではなく、100%

    関連する問題