旋转ImageView时,咖啡测试永远需要

时间:2018-08-28 09:05:51

标签: android testing android-testing android-espresso

我有两个相似的ImageView。我决定不为第二个ImageView创建不同的可绘制对象,并使用相同的可绘制对象对其进行旋转。

<ImageView
    android:id="@+id/rightTurn_imageView"
    android:layout_width="@dimen/width_imageViews_feedback_area_info"
    android:layout_height="@dimen/height_imageViews_feedback_area_info"
    android:layout_marginLeft="@dimen/margin_before_imageViews_feedback_area_info"
    android:layout_marginStart="@dimen/margin_before_imageViews_feedback_area_info"
    android:layout_marginTop="@dimen/margin_above_imageViews_feedback_area_info"
    android:scaleType="fitCenter"
    app:layout_constraintStart_toEndOf="@+id/emergency_imageView"
    app:layout_constraintTop_toTopOf="@+id/feedback_area_info"
    android:rotation="180"/> <! -- The line where the problem occurs -->

我正在尝试使用Espresso测试我的UI。我试图查看是否有Toast出现,并且Test功能永远存在。

@Test
fun showToastOnClickRightDirectionLight() {
    onView(withId(R.id.rightTurn_imageView))
        .perform(click())
    onView(
        withText(
            containsString(
                activityRule.activity.resources.getString(
                    R.string.long_click_info
                )
            )
        )
    )
        .inRoot(RootMatchers.withDecorView(not(activityRule.activity.window.decorView)))
        .check(matches(isDisplayed()))
}

每当我从xml(android:rotation="180")中删除旋转线时,测试就会成功完成。
当我测试UI时,用手指(!)可以正常工作,即使是否旋转也是如此。

是否有解决此问题的方法,还是应该创建另一个可绘制对象?

还可以有人解释为什么会这样吗? rotating怎么了?

2 个答案:

答案 0 :(得分:0)

查看2.3 -> Device settings部分下面的链接:

  

建议在Android设备上打开动画   用于测试。动画可能会混淆Espressos的检查   隐藏资源。

http://www.vogella.com/tutorials/AndroidTestingEspresso/article.html

答案 1 :(得分:0)

似乎setRotation可能影响了屏幕上视图的坐标计算。因此,您可以尝试使用自定义点击操作:

public static ViewAction forceClick() {
    return new ViewAction() {
        @Override public Matcher<View> getConstraints() {
            return allOf(isClickable(), isEnabled(), isDisplayed());
        }

        @Override public String getDescription() {
            return "force click";
        }

        @Override public void perform(UiController uiController, View view) {
            view.performClick();
            uiController.loopMainThreadUntilIdle();
        }
    };
}

然后将其用于按钮或带有单击侦听器的任何视图:

onView(withId(R.id.move_up)).perform(forceClick());