📅  最后修改于: 2020-12-06 09:35:00             🧑  作者: Mango
Espresso提供各种选项来创建我们自己的自定义视图匹配器,它基于Hamcrest匹配器。自定义匹配器是一个非常强大的概念,可以扩展框架并根据我们的喜好自定义框架。编写自定义匹配器的一些优点如下:
利用我们自己的自定义视图的独特功能
自定义匹配器有助于基于AdapterView的测试用例与不同类型的基础数据匹配。
通过组合多个匹配器的功能来简化当前匹配器
我们可以在需求出现时创建新的匹配器,这很容易。让我们创建一个新的自定义匹配器,它返回一个匹配器以测试TextView的id和文本。
Espresso提供以下两个类来编写新的匹配器-
类型安全匹配器
有界的匹配者
这两个类在本质上是相似的,只是BoundedMatcher透明地将对象的类型转换处理为正确的类型,而无需手动检查正确的类型。我们将创建一个新的匹配,withIdAndText使用BoundedMatcher类。让我们检查编写新匹配器的步骤。
将以下依赖项添加到app / build.gradle文件中并进行同步。
dependencies {
implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
创建一个新类以包含我们的匹配器(方法)并将其标记为最终类
public final class MyMatchers {
}
在新类中声明一个带有必要参数的静态方法,并将Matcher
public final class MyMatchers {
@NonNull
public static Matcher withIdAndText(final Matcher
integerMatcher, final Matcher stringMatcher) {
}
}
在静态方法中使用以下签名创建一个新的BoundedMatcher对象(也返回值),
public final class MyMatchers {
@NonNull
public static Matcher withIdAndText(final Matcher
integerMatcher, final Matcher stringMatcher) {
return new BoundedMatcher(TextView.class) {
};
}
}
覆盖在BoundedMatcher对象describeTo和matchesSafely方法。 describeTo具有类型为Description的单个参数,没有返回类型,它用于与匹配器有关的错误信息。 matchesSafely有一个TextView类型的参数,返回类型为boolean ,用于匹配视图。
该代码的最终版本如下:
public final class MyMatchers {
@NonNull
public static Matcher withIdAndText(final Matcher
integerMatcher, final Matcher stringMatcher) {
return new BoundedMatcher(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!")));
}