使用 Espresso 测试假设视图状态

Assume view state with Espresso test

JUnit 库有一个像 Assume.assumeTrue(boolean) 这样的 Assume.* 指令,它像断言一样工作,但不会导致测试失败而只是被忽略。

我想在测试的 arrange 部分中针对我的一个视图执行此类检查,例如假设,在开始测试的 act 部分之前选中已创建的复选框。

看看:

@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

@Test
public void deselectFilter_AllFiltersSelected_CheckboxAllSelectedUnchecked() {
    //arrange
    ViewInteraction checkBox = onView(
            allOf(withId(R.id.cbCheckAll), isDisplayed()));

    //assume that this checkbox is checked 

    //act
    ...
    //assert
    ...
}

arrange 部分,我收到的不是 View,而是 ViewInteraction。 所以我可以像 checkBox.check(matches(isChecked()))
这样的 assertion 但是假设如何执行?

目前我创建的唯一方法就是使用 activity 从测试规则中手动找到假设视图。然后通过 jUnit 假设。

CheckBox checkBox = (CheckBox) mActivityTestRule.getActivity().findViewById(R.id.cbCheckAll);
Assume.assumeTrue(checkBox.isChecked());

如果您知道更好的方法,也许是使用 Espresso,请回答。似乎无法直接从 Espresso 命令访问视图

您可以编写自定义 ViewAssertion 以假设当 Espresso ViewMatcher 失败时不会抛出 Exception

public static ViewAssertion assume(final Matcher<? super View> viewMatcher) {
    return new ViewAssertion() {
        @Override
        public void check(final View view, final NoMatchingViewException noViewFoundException) {
            try {
                ViewAssertions.matches(viewMatcher).check(view, noViewFoundException);
            } catch (Throwable e) {
                // Assume that there is no exception
                Assume.assumeNoException(e);
            }
        }
    };
}

然后您可以使用该断言来假设:

onView(withId(R.id.cbCheckAll)).check(assume(isChecked()));