Espresso 定制匹配器
默认情况下,Espresso 有许多匹配器,可帮助你查找进行某些检查或与之交互所需的视图。
最重要的可以在以下备忘单中找到:
https://google.github.io/android-testing-support-library/docs/espresso/cheatsheet/
匹配器的一些示例是:
- withId(R.id.ID_of_object_you_are_looking_for);
- withText(你希望对象有一些文字);
isDisplayed()
< - check 是可见的视图doesNotExist()
< - 检查视图是否不存在
所有这些对于日常使用都非常有用,但如果你有更复杂的视图编写自定义匹配器可以使测试更具可读性,你可以在不同的地方重用它们。
你可以扩展 2 种最常见的匹配器类型: TypeSafeMatcher BoundedMatcher
实现 TypeSafeMatcher 要求你检查实例是否为你要断言的视图,如果它是正确的类型,你将其某些属性与你提供给匹配器的值相匹配。
例如,类型安全匹配器验证图像视图具有正确的 drawable:
public class DrawableMatcher extends TypeSafeMatcher<View> {
private @DrawableRes final int expectedId;
String resourceName;
public DrawableMatcher(@DrawableRes int expectedId) {
super(View.class);
this.expectedId = expectedId;
}
@Override
protected boolean matchesSafely(View target) {
//Type check we need to do in TypeSafeMatcher
if (!(target instanceof ImageView)) {
return false;
}
//We fetch the image view from the focused view
ImageView imageView = (ImageView) target;
if (expectedId < 0) {
return imageView.getDrawable() == null;
}
//We get the drawable from the resources that we are going to compare with image view source
Resources resources = target.getContext().getResources();
Drawable expectedDrawable = resources.getDrawable(expectedId);
resourceName = resources.getResourceEntryName(expectedId);
if (expectedDrawable == null) {
return false;
}
//comparing the bitmaps should give results of the matcher if they are equal
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
Bitmap otherBitmap = ((BitmapDrawable) expectedDrawable).getBitmap();
return bitmap.sameAs(otherBitmap);
}
@Override
public void describeTo(Description description) {
description.appendText("with drawable from resource id: ");
description.appendValue(expectedId);
if (resourceName != null) {
description.appendText("[");
description.appendText(resourceName);
description.appendText("]");
}
}
}
匹配器的用法可以像这样包装:
public static Matcher<View> withDrawable(final int resourceId) {
return new DrawableMatcher(resourceId);
}
onView(withDrawable(R.drawable.someDrawable)).check(matches(isDisplayed()));
有界匹配器类似于你不需要进行类型检查,但是,因为这是自动完成的:
/**
* Matches a {@link TextInputFormView}'s input hint with the given resource ID
*
* @param stringId
* @return
*/
public static Matcher<View> withTextInputHint(@StringRes final int stringId) {
return new BoundedMatcher<View, TextInputFormView>(TextInputFormView.class) {
private String mResourceName = null;
@Override
public void describeTo(final Description description) {
//fill these out properly so your logging and error reporting is more clear
description.appendText("with TextInputFormView that has hint ");
description.appendValue(stringId);
if (null != mResourceName) {
description.appendText("[");
description.appendText(mResourceName);
description.appendText("]");
}
}
@Override
public boolean matchesSafely(final TextInputFormView view) {
if (null == mResourceName) {
try {
mResourceName = view.getResources().getResourceEntryName(stringId);
} catch (Resources.NotFoundException e) {
throw new IllegalStateException("could not find string with ID " + stringId, e);
}
}
return view.getResources().getString(stringId).equals(view.getHint());
}
};
}
有关匹配器的更多信息,请阅读:
https://developer.android.com/reference/android/support/test/espresso/matcher/ViewMatchers.html