Pencocok Tampilan Kustom

Espresso menyediakan berbagai opsi untuk membuat matcher tampilan kustom kami sendiri dan ini didasarkan pada Hamcrest matcher . Pencocok khusus adalah konsep yang sangat kuat untuk memperluas kerangka dan juga menyesuaikan kerangka sesuai selera kita. Beberapa keuntungan menulis custom matcher adalah sebagai berikut,

  • Untuk memanfaatkan fitur unik dari tampilan kustom kami sendiri

  • Pencocokan khusus membantu dalam kasus pengujian berbasis AdapterView untuk mencocokkan dengan jenis data pokok yang berbeda.

  • Untuk menyederhanakan matcher saat ini dengan menggabungkan fitur beberapa matcher

Kami dapat membuat matcher baru jika ada permintaan dan itu cukup mudah. Mari kita buat pencocokan khusus baru, yang mengembalikan pencocokan untuk menguji id dan teks dari TextView .

Espresso menyediakan dua kelas berikut untuk menulis matcher baru -

  • TypeSafeMatcher

  • BoundedMatcher

Kedua kelas memiliki sifat yang serupa kecuali bahwa BoundedMatcher secara transparan menangani casting objek untuk mengoreksi tipe tanpa secara manual memeriksa tipe yang benar. Kami akan membuat matcher baru, withIdAndText menggunakan kelas BoundedMatcher . Mari kita periksa langkah-langkah untuk menulis pencocokan baru.

  • Tambahkan dependensi di bawah ini dalam file app / build.gradle dan sinkronkan.

dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Buat kelas baru untuk menyertakan pencocokan kami (metode) dan tandai sebagai final

public final class MyMatchers {
}
  • Deklarasikan metode statis di dalam kelas baru dengan argumen yang diperlukan dan setel Matcher <View> sebagai tipe kembalian.

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • Buat objek BoundedMatcher baru (juga nilai kembalian) dengan tanda tangan di bawah ini di dalam metode statis,

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) {
      };
   }
}
  • Menimpa describeTo dan matchesSafely metode dalam BoundedMatcher objek. descriptionTo memiliki argumen tunggal bertipe Description with no return type dan digunakan untuk informasi kesalahan terkait matcher. matchSafely memiliki satu argumen bertipe TextView dengan tipe kembalian boolean dan digunakan untuk mencocokkan tampilan.

Versi terakhir dari kode tersebut adalah sebagai berikut,

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());
         }
      };
   }
}
  • Akhirnya, Kami dapat menggunakan pencocokan mew kami untuk menulis kasus uji seperti yang ditampilkan di bawah ini,

@Test
public void view_customMatcher_isCorrect() {
   onView(withIdAndText(is((Integer) R.id.textView_hello), is((String) "Hello World!")))
      .check(matches(withText("Hello World!")));
}