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