IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Espresso(五) ——Custom Matcher -> 正文阅读

[移动开发]Android Espresso(五) ——Custom Matcher

Android Espresso(五) ——Custom Matcher

上一篇(Android Espresso(四)——RecyclerView)提到了使用自定义 ViewAction 来灵活应对 RecyclerView 中复杂Item测试。

这一篇讲下,在某种场景下,相同文字不同颜色或者其他属性,匹配其中一个组件进行操作,使用自定义ViewMatcher

自定义Matcher

在匹配一些简单的UI组件上,可以使用 BoundedMatcher 快速定义自己的 Matcher

static class CustomViewMatchers {

        public static Matcher<View> withColoredText(final int expectedColor) {
            return new BoundedMatcher<View, TextView>(TextView.class) {
                @Override
                public void describeTo(Description description) { // 为matcher添加描述信息
                    description.appendText("To find the textview with " + expectedColor + " color text");
                }

                // 主要实现这个matchesSafely()方法,来实现自己想要获取到的View。
                // 这里需要注意参数类型 TextView 与 BoundedMatcher构造方法传入的 TextView在定义上是不同的。
                // 见下面BoundedMatcher定义
                @Override
                protected boolean matchesSafely(TextView item) {
                    return expectedColor == item.getCurrentTextColor();
                }
            };
        }
    }

上述这段代码,可以快速看下如何使用 BoundedMatcher 来定义自己的 Matcher。

BoundedMatcher

先来看下 BoundedMatcher 定义。

// 在创建BoundedMatcher实例时,需要传入泛型类型T,S.
// T 表示Matcher要处理的类型,S 表示的操作实际的T的子类型
public abstract class BoundedMatcher<T, S extends T> extends BaseMatcher<T> {

  private final Class<?> expectedType;
  private final Class<?>[] interfaceTypes;

  public BoundedMatcher(Class<? extends S> expectedType) {
    this.expectedType = checkNotNull(expectedType);
    this.interfaceTypes = new Class[0];
  }

  public BoundedMatcher(
      Class<?> expectedType, Class<?> interfaceType1, Class<?>... otherInterfaces) {
    this.expectedType = checkNotNull(expectedType);
    checkNotNull(otherInterfaces);
    int interfaceCount = otherInterfaces.length + 1;
    this.interfaceTypes = new Class[interfaceCount];

    interfaceTypes[0] = checkNotNull(interfaceType1);
    checkArgument(interfaceType1.isInterface());
    int interfaceTypeIdx = 1;
    for (Class<?> intfType : otherInterfaces) {
      interfaceTypes[interfaceTypeIdx] = checkNotNull(intfType);
      checkArgument(intfType.isInterface());
      interfaceTypeIdx++;
    }
  }

  // 这里参数item的类型是S, 在创建BoundedMatcher实例时传入的泛型S
  protected abstract boolean matchesSafely(S item);

  // 真正的逻辑处理,判断传入的expectedType是否是同时传入的 interfaceTypes 中的类型,
  // 满足条件之后,调用matchesSafely()方法进行匹配。
  @Override
  @SuppressWarnings({"unchecked"})
  public final boolean matches(Object item) {
    if (item == null) {
      return false;
    }

    if (expectedType.isInstance(item)) {
      for (Class<?> intfType : interfaceTypes) {
        if (!intfType.isInstance(item)) {
          return false;
        }
      }
      return matchesSafely((S) item);
    }
    return false;
  }
}

BoundedMatcher本身的定义中包含了两个构造方法,第二个构造方法中可以同时传入多个需要进行匹配的类型。我们在上述实现使用的是单个参数的构造方法。

@Test
public void testCustomMatcher() throws InterruptedException {
    Activity activity = activityTestRule.getActivity();
    onView(withId(R.id.textview_red_text)).check(matches(withColoredText(activity.getColor(android.R.color.holo_red_dark)))).perform(click());
    Thread.sleep(1000); // 为了执行看清UI变化

    // 点击button,修改TextView文字颜色
    onView(withId(R.id.button_change_color)).check(matches(isAssignableFrom(Button.class))).perform(click());
    Thread.sleep(1000);

    // 判断修改后的问题是否是预期的颜色
    onView(withId(R.id.textview_common_text)).check(matches(withColoredText(Color.BLUE))).perform(click());
}

这里直接使用check()方法来检查传入的颜色是否与ID匹配的TextView颜色形同。

看下运行效果。
在这里插入图片描述

总结

除了 BoundedMatcher,Espresso还提供其他诸如CustomMatcherTypeSafeMatcher等可用于自定义Matcher的定义。

这篇文章中只列举了BoundedMatcher的使用,其他Matcher的使用或执行原理,感兴趣的同学可以自己再查看下定义。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:39:10  更:2021-08-22 13:40:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:01:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码