Espresso之Matcher

总目录:Espresso从开始到…

只要使用了Espresso,那么你一定不会对withId(R.id.xxx)withText(R.string.xxx)这些ViewMatchers感到陌生。实际上无论是ViewMatchersRootMatchers亦或者是Matchers,这些本质上都是Matcher。只是为了方便不同的使用环境进行了封装,本文将对Matcher以及这些封装后的工具进行分析。

Matcher

所有的matcher都实现了接口Matcher

public interface Matcher<T> extends SelfDescribing {

    //遍历当前视图中的 view ,匹配则返回true,失败返回false
	boolean matches(Object item);
    
    //生成本次匹配操作的描述信息
	void describeMismatch(Object item, Description mismatchDescription);
}

其中matches()是匹配的重点所在,在这里执行匹配的操作。
但是在使用过程中,我们并没有直接实现Matcher,而是实现其子类BaseMatcher所派生的封装类:TypeSafeMatcherBoundedMatcher

1.TypeSafeMatcher

TypeSafeMatcher封装后的最大的区别是,增加了 isInstance()检查当前参加匹配的目标是否符合条件。我们看一下源码,为了便于区别和阅读,只筛选出来一部分代码:

public abstract class TypeSafeMatcher<T> extends BaseMatcher<T> {
    final private Class<?> expectedType;
    protected TypeSafeMatcher(Class<?> expectedType) {
        this.expectedType = expectedType;
    }
    protected abstract boolean matchesSafely(T item);
    public final boolean matches(Object item) {
        return item != null
                && expectedType.isInstance(item)
                && matchesSafely((T) item);
    }
    final public void describeMismatch(Object item, Description description) {
	......
    }
}

这里我们可以清楚的看出和原始的BaseMatcher最大的区别是存储了一个expectedType,在matchesSafely()判断前会增加一个判断,当前 item是否是expectedType的实例或者子类。这样可以防止出现不同类型的恰好匹配的情况,相对于BaseMatcher是更加安全的。
我们看一个具体使用的栗子:

  public static Matcher<View> withId(final int id) {
    return new TypeSafeMatcher<View>() {
      ......
      @Override
      public void describeTo(Description description) {
   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值