在Espresso测试中断言ProgressBar的进度

时间:2019-08-16 22:10:44

标签: java android junit progress-bar android-espresso

我有一个ProgressBar,它会随着用户逐步执行一系列操作而填写。

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:indeterminate="false"
    android:max="100"
    android:progress="50"
    ... />

我想用JUnit和Espresso编写一个测试,该测试在不同步骤中声明progress属性的值。像这样...

onView(withId(R.id.progressBar)).check(matches(withProgress(50)));

似乎没有类似于withProgress方法的东西。断言进度的方法是什么?

2 个答案:

答案 0 :(得分:0)

Espresso似乎不允许使用check ViewInteraction的progress属性。但是,可以直接从视图恢复进度条视图并使用assertThat声明其值。

@Test
public void ExampleAssertProgressBar(){
    ProgressBar progressBar = activity.getActivity().findViewById(R.id.progressBar);
    int progress = progressBar.getProgress();
    assertThat(progress, equalTo(50));
}

因为这非常简单,所以我认为这是可行的方法。

答案 1 :(得分:0)

如果有人需要其他示例说明或需要声明MaxProgress,颜色和Progress。我的答案是在Kotlin中,我从Java答案:https://stackoverflow.com/a/58964772/11793333中分叉出来。

fun matchesProgressBarTintAndMaxProgress(
    expectedResourceId: ColorStateList?,
    maxExpected: Int,
    progressExpected: Int?
): Matcher<View?>? {
    return object : BoundedMatcher<View?, View>(View::class.java) {
        var actualColor: ColorStateList? = null
        var actualMaxProgress = 0
        var actualProgress = 0
        var message: String? = null
        override fun matchesSafely(item: View): Boolean {
            actualColor = (item as ProgressBar).progressTintList
            actualMaxProgress = item.max
            actualProgress = item.progress


            return actualColor == expectedResourceId && actualMaxProgress == maxExpected && actualProgress == progressExpected
        }

        override fun describeTo(description: Description) {

            message = ("Tint color match: ${actualColor == expectedResourceId} "
                    + "MaxProgress match: ${actualMaxProgress == maxExpected} "
                    + "ActualProgress match: ${actualProgress == progressExpected}")

            description.appendText(message)
        }
    }
}

要使用它:

            onView(withId(R.id.progressBar)).check(
                matches(
                    matchesProgressBarTintAndMaxProgress(
                        ColorStateList.valueOf(
                            ContextCompat.getColor(
                                context,
                                R.color.red
                            )
                        ),
                        100,
                        50
                    )
                )
            )