我有一个Activity
有两个Views
- 根据网络状况显示。
LinearLayout recyclerView = (LinearLayout) findViewById(R.id.recycler_view);
LinearLayout errorParent = (LinearLayout) findViewById(R.id.error_parent);
if(Utils.isNetworkAvailable()){
recyclerView.setVisibility(View.VISIBLE);
errorParent.setVisibility(View.GONE);
}else{
recyclerView.setVisibility(View.GONE);
errorParent.setVisibility(View.VISIBLE);
}
我已经编写了Espresso测试来测试网络状况。在运行测试之前,我手动关闭Internet。
ViewInteraction viewInteraction = onView(withId(R.id.recycler_view));
viewInteraction.check(matches(isDisplayed()));
由于没有互联网,recycler_view
为GONE
,因此它不存在于视图层次结构中。但是在运行代码时我没有得到NoMatchingViewException
。理想情况下,当层次结构中不存在视图时,我应该得到上述异常。相反,我得到AssertionFailedError
。
这种行为的原因是什么?
答案 0 :(得分:2)
这里最好的解决方案是查看Espresso
的源代码。让我们来看看发生了什么。
在此check(final ViewAssertion viewAssert)
中调用line时,将检查该视图是否在层次结构中。未捕获异常NoMatchingViewException
,因为viewFinder
在层次结构中查找视图。然后代码转到assertion。因此代码更加完善ViewAssertion
的功能:matches(final Matcher<? super View> viewMatcher)
missingViewException
为空。
在此line noViewException
为空,因此代码转到assertThat
。断言为isDisplayed()
,用于衡量global effective visibility of the view。这是抛出AssertionFailedError
的地方。
为了断言视图在当前布局中不可见,应该使用另一种结构:
onView({Matcher<View>}).check(doesNotExist());
或
onView({Matcher<View>}).check(matches(not(isDisplayed())));
关于它的更多解释here
答案 1 :(得分:0)
在我看来这是适当的行为。您的视图存在于视图层次结构中,只是不可见。你应该得到:
AssertionFailedWithCauseError: 'is displayed on the screen to the user' doesn't match the selected view.
Expected: is displayed on the screen to the user