android - 如何使用 espresso 来测试矢量绘图
问题描述
我有一个矢量可绘制对象,我想使用浓缩咖啡进行测试。
<TextView
android:id="@+id/text_video_call"
style="@style/UserDetails.TextView.Actions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:drawableTop="@drawable/ic_video_24dp"
android:text="@string/msg_video_call"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/text_message"
app:layout_constraintTop_toBottomOf="@+id/text_username"
tools:visibility="visible" />
矢量可绘制:ic_video_24dp
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:fillColor="#1d74f5"
android:fillType="evenOdd"
android:pathData="M16.538,13.564l-3.388,-1.09v-2.07l3.394,-1.085 -0.006,4.245zM11.696,14.56L3.454,14.56L3.454,8.32h8.242v6.24zM17.428,8.107c0.362,0.261 0.57,0.69 0.57,1.176v4.312c0,0.487 -0.209,0.914 -0.57,1.175a1.37,1.37 0,0 1,-0.808 0.254c-0.164,0 -0.331,-0.026 -0.498,-0.08l-2.972,-0.956L13.15,16L2,16L2,6.88h11.15v2.01l2.973,-0.956c0.468,-0.15 0.943,-0.087 1.305,0.173zM4.424,5.44L4.424,4h6.302v1.44L4.424,5.44z" />
</vector>
有什么方法可以 UI 测试使用 espresso 绘制的矢量吗?任何帮助将不胜感激。
解决方案
最好不要比较位图,而是遵循这个答案的建议:https ://stackoverflow.com/a/14474954/1396068
设置图像视图的可绘制对象时,还将可绘制对象 ID 存储在其标签中,setTag(R.drawable.your_drawable).
然后使用 Espresso 的withTagValue(equalTo(R.drawable.your_drawable))
匹配器检查正确的标签。
请检查我发现的本教程。似乎工作得很好https://medium.com/@dbottillo/android-ui-test-espresso-matcher-for-imageview-1a28c832626f#.4snjg8frw
这是复制粘贴的摘要;-)
public class DrawableMatcher extends TypeSafeMatcher<View> {
private final int expectedId;
String resourceName;
public DrawableMatcher(int expectedId) {
super(View.class);
this.expectedId = expectedId;
}
@Override
protected boolean matchesSafely(View target) {
if (!(target instanceof ImageView)){
return false;
}
ImageView imageView = (ImageView) target;
if (expectedId < 0){
return imageView.getDrawable() == null;
}
Resources resources = target.getContext().getResources();
Drawable expectedDrawable = resources.getDrawable(expectedId);
resourceName = resources.getResourceEntryName(expectedId);
if (expectedDrawable == null) {
return false;
}
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("]");
}
}
}
请注意,这仅在您的 Drawable 是 BitmapDrawable 时有效。如果你还有 VectorDrawable 或其他 Drawable,你必须检查这个 (imageView.getDrawable() instanceOf XXXDrawable) 并从中获取位图。除非你有某种简单的 Drawable,你只有一种颜色,所以你可以比较。
为了获得 VectorDrawable 的位图,即您必须将 VectorDrawable 绘制到画布并将其保存到位图。如果你有一个 StateListDrawable 你可以得到所选状态的 Drawable 并重复你的 if 实例的级联。
推荐阅读
- java - 新的 Google Places SDK 不会在 Android 中获取用户选择
- jekyll - 我的 Jekyll 帖子在生产中抛出 404 错误
- youtube-data-api - publishedAfter 参数现在似乎被破坏了
- installation - 使用 CustomAction 卸载 Wix 的问题
- java - java - 如何在java中以某个角度向前移动形状?
- matlab - 如何在此图像中找到边界表面
- android - 如何从“addOnSuccessListener”中的firebase存储中获取字符串中的下载URL
- android - 如何更改首选项的字体大小?
- javascript - 来自 React 渲染方法中变量的对象数组的问题
- python - 读取 csv 文件时出现无效的继续字节错误