gpt4 book ai didi

android-espresso - 安卓。 Espresso : can't check background

转载 作者:行者123 更新时间:2023-12-03 23:37:06 26 4
gpt4 key购买 nike

Windows 10(64 位),
安卓工作室 3.1.2,
Gradle 4.4,Java 1.8。
这是我的布局 xml

<TextView
android:id="@+id/loginTextView"
android:layout_width="255dp"
android:layout_height="60dp"
android:layout_marginBottom="15dp"
android:background="@drawable/sign_in_login_bg"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/registerTextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
这里 @drawable/sign_in_login_bg
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_primary" />
<corners android:radius="@dimen/text_view_rounded_corner_radius" />
</shape>
我想编写 Espresso 测试来检查 loginTextView 有背景 @drawable/sign_in_login_bg
所以我写了自定义匹配器:
import org.hamcrest.Matcher;
public static Matcher<View> withBackground(final int expectedResourceId) {

return new BoundedMatcher<View, View>(View.class) {

@Override
public boolean matchesSafely(View view) {
return sameBitmap(view.getContext(), view.getBackground(), expectedResourceId);
}

@Override
public void describeTo(Description description) {
description.appendText("has background resource " + expectedResourceId);
}
};
}
这里方法 相同位图 :
private static boolean sameBitmap(Context context, Drawable drawable, int expectedId) {
Drawable expectedDrawable = ContextCompat.getDrawable(context, expectedId);
if (drawable == null || expectedDrawable == null) {
return false;
}
if (drawable instanceof StateListDrawable && expectedDrawable instanceof StateListDrawable) {
drawable = drawable.getCurrent();
expectedDrawable = expectedDrawable.getCurrent();
}
if (drawable instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap otherBitmap = ((BitmapDrawable) expectedDrawable).getBitmap();
return bitmap.sameAs(otherBitmap);
}
return false;
}
这是我的 Espresso 测试:
@Test
public void loginTextViewBackground() {



onView(withId(R.id.loginTextView)).check(matches(withBackground(R.drawable.sign_in_login_bg)));
}
但我得到错误:
android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'has background resource 2131230909' doesn't match the selected view.
Expected: has background resource 2131230909
Got: "AppCompatTextView{id=2131296429, res-name=loginTextView, visibility=VISIBLE, width=765, height=180, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.support.constraint.ConstraintLayout$LayoutParams@bcce82, tag=null, root-is-layout-requested=false, has-input-connection=false, x=158.0, y=1283.0, text=Login, input-type=0, ime-target=false, has-links=false}"

at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:90)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:52)
at android.support.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:314)
at android.support.test.espresso.ViewInteraction.check(ViewInteraction.java:291)
at com.myproject.android.activity.SignInActivityTest.loginTextViewBackground(SignInActivityTest.java:158)

at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
Caused by: junit.framework.AssertionFailedError: 'has background resource 2131230909' doesn't match the selected view.
Expected: has background resource 2131230909
Got: "AppCompatTextView{id=2131296429, res-name=loginTextView, visibility=VISIBLE, width=765, height=180, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.support.constraint.ConstraintLayout$LayoutParams@bcce82, tag=null, root-is-layout-requested=false, has-input-connection=false, x=158.0, y=1283.0, text=Login, input-type=0, ime-target=false, has-links=false}"

at android.support.test.espresso.matcher.ViewMatchers.assertThat(ViewMatchers.java:526)

最佳答案

由于您的 drawable 是 GradientDrawable,因此它也必须在您的 Matcher 中处理。因此,您的匹配器可能如下所示:

private static boolean sameBitmap(Context context, Drawable drawable, int expectedId) {
Drawable expectedDrawable = ContextCompat.getDrawable(context, expectedId);
if (drawable == null || expectedDrawable == null) {
return false;
}

if (drawable instanceof StateListDrawable && expectedDrawable instanceof StateListDrawable) {
drawable = drawable.getCurrent();
expectedDrawable = expectedDrawable.getCurrent();
}
if (drawable instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap otherBitmap = ((BitmapDrawable) expectedDrawable).getBitmap();
return bitmap.sameAs(otherBitmap);
}

if (drawable instanceof VectorDrawable ||
drawable instanceof VectorDrawableCompat ||
drawable instanceof GradientDrawable) {
Rect drawableRect = drawable.getBounds();
Bitmap bitmap = Bitmap.createBitmap(drawableRect.width(), drawableRect.height(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);

Bitmap otherBitmap = Bitmap.createBitmap(drawableRect.width(), drawableRect.height(), Bitmap.Config.ARGB_8888);
Canvas otherCanvas = new Canvas(otherBitmap);
expectedDrawable.setBounds(0, 0, otherCanvas.getWidth(), otherCanvas.getHeight());
expectedDrawable.draw(otherCanvas);
return bitmap.sameAs(otherBitmap);
}
return false;
}

关于android-espresso - 安卓。 Espresso : can't check background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com