使用Espresso测试假设视图状态

时间:2016-10-17 07:55:05

标签: android junit junit4 functional-testing android-espresso

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

我想在我的一个视图的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。 所以我可以执行assertion之类的checkBox.check(matches(isChecked())) 但是如何表现呢?

2 个答案:

答案 0 :(得分:2)

您可以编写自定义ViewAssertion,假设Espresso Exception失败时不会引发ViewMatcher

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()));

答案 1 :(得分:0)

我此时创立的唯一方法就是通过测试规则的活动手动查看假设视图。然后通过jUnit假设。

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

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