Espresso-testing-custom-view-matchers

提供:Dev Guides
移動先:案内検索

カスタムビューマッチャー

Espressoには、独自のカスタムビューマッチャーを作成するためのさまざまなオプションがあり、_Hamcrest_マッチャーに基づいています。 カスタムマッチャーは、フレームワークを拡張し、好みに合わせてフレームワークをカスタマイズするための非常に強力な概念です。 カスタムマッチャーを作成する利点のいくつかは次のとおりです。

  • 独自のカスタムビューのユニークな機能を活用するには
  • カスタムマッチャーは、_AdapterView_ベースのテストケースでさまざまな種類の基になるデータと照合するのに役立ちます。
  • 複数のマッチャーの機能を組み合わせて、現在のマッチャーを簡素化するには

需要が生じたときに新しいマッチャーを作成でき、非常に簡単です。 新しいカスタムマッチャーを作成して、_TextView_のidとテキストの両方をテストするマッチャーを返します。

エスプレッソは、新しいマッチャーを記述するために次の2つのクラスを提供します-

  • TypeSafeMatcher
  • BoundedMatcher

両方のクラスは性質が似ていますが、_BoundedMatcher_は、正しい型を手動で確認することなく、正しい型へのオブジェクトのキャストを透過的に処理します。 _BoundedMatcher_クラスを使用して、新しいマッチャー_withIdAndText_を作成します。 新しいマッチャーを作成する手順を確認しましょう。

  • _app/build.gradle_ファイルに以下の依存関係を追加して同期します。
dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • マッチャー(メソッド)を含める新しいクラスを作成し、_final_としてマークします
public final class MyMatchers {
}
  • 必要な引数を使用して新しいクラス内で静的メソッドを宣言し、Matcher <View>を戻り値の型として設定します。
public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • 静的メソッド内に以下のシグネチャを持つ新しいBoundedMatcherオブジェクト(戻り値も)を作成します。
public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
      return new BoundedMatcher<View, TextView>(TextView.class) {
      };
   }
}
  • _BoundedMatcher_オブジェクトの_describeTo_および_matchesSafely_メソッドをオーバーライドします。 describeToには、戻り値のないタイプ_Description_の単一の引数があり、マッチャーに関するエラー情報に使用されます。 _matchesSafely_には戻り値の型_boolean_を持つTextView型の引数が1つあり、ビューの照合に使用されます。

コードの最終バージョンは次のとおりです。

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
      return new BoundedMatcher<View, TextView>(TextView.class) {
         @Override
         public void describeTo(final Description description) {
            description.appendText("error text: ");
            stringMatcher.describeTo(description);
            integerMatcher.describeTo(description);
         }
         @Override
         public boolean matchesSafely(final TextView textView) {
            return stringMatcher.matches(textView.getText().toString()) &&
            integerMatcher.matches(textView.getId());
         }
      };
   }
}
  • 最後に、mewマッチャーを使用して、以下に示すテストケースを記述できます。
@Test
public void view_customMatcher_isCorrect() {
   onView(withIdAndText(is((Integer) R.id.textView_hello), is((String) "Hello World!")))
      .check(matches(withText("Hello World!")));
}