Trình khớp chế độ xem tùy chỉnh

Espresso cung cấp các tùy chọn khác nhau để tạo các trình so khớp chế độ xem tùy chỉnh của riêng chúng tôi và nó dựa trên các trình so khớp của Hamcrest . Custom matcher là một khái niệm rất mạnh mẽ để mở rộng khuôn khổ và cũng để tùy chỉnh khuôn khổ theo sở thích của chúng ta. Một số ưu điểm của việc viết trình khớp tùy chỉnh như sau,

  • Để khai thác tính năng độc đáo của chế độ xem tùy chỉnh của riêng chúng tôi

  • Trình so khớp tùy chỉnh giúp trong các trường hợp thử nghiệm dựa trên AdapterView khớp với các loại dữ liệu cơ bản khác nhau.

  • Để đơn giản hóa các trình so khớp hiện tại bằng cách kết hợp các tính năng của nhiều trình so khớp

Chúng tôi có thể tạo trình kết hợp mới khi có nhu cầu và khá dễ dàng. Hãy để chúng tôi tạo một đối sánh tùy chỉnh mới, trả về một đối sánh để kiểm tra cả id và văn bản của TextView .

Espresso cung cấp hai lớp sau để viết các trình kết hợp mới -

  • TypeSafeMatcher

  • BoundedMatcher

Cả hai lớp đều giống nhau về bản chất ngoại trừ việc BoundMatcher xử lý trong suốt quá trình truyền đối tượng thành kiểu đúng mà không cần kiểm tra thủ công để tìm đúng kiểu. Chúng tôi sẽ tạo một trình đối sánh mới, vớiIdAndText bằng cách sử dụng lớp BoundMatcher . Hãy để chúng tôi kiểm tra các bước để viết đối sánh mới.

  • Thêm phần phụ thuộc bên dưới vào tệp app / build.gradle và đồng bộ hóa nó.

dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Tạo một lớp mới để bao gồm các đối sánh (phương thức) của chúng tôi và đánh dấu nó là cuối cùng

public final class MyMatchers {
}
  • Khai báo một phương thức tĩnh bên trong lớp mới với các đối số cần thiết và đặt Matcher <View> làm kiểu trả về.

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • Tạo một đối tượng BoundMatcher mới (cả giá trị trả về) với chữ ký bên dưới bên trong phương thức tĩnh,

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 describeTomatchesSafely phương pháp trong BoundedMatcher đối tượng. descriptionTo có một đối số duy nhất thuộc kiểu Mô tả không có kiểu trả về và nó được sử dụng để báo lỗi thông tin liên quan đến trình so khớp. matchSafely có một đối số duy nhất kiểu TextView với kiểu trả về là boolean và nó được sử dụng để khớp với dạng xem.

Phiên bản cuối cùng của mã như sau,

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());
         }
      };
   }
}
  • Cuối cùng, chúng ta có thể sử dụng mew matcher của mình để viết trường hợp thử nghiệm như được gieo bên dưới,

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