当视图的可见性消失时,Espresso不会抛出NoMatchingViewException

时间:2016-12-15 08:28:45

标签: android junit automated-tests android-espresso

我有一个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_viewGONE,因此它不存在于视图层次结构中。但是在运行代码时我没有得到NoMatchingViewException。理想情况下,当层次结构中不存在视图时,我应该得到上述异常。相反,我得到AssertionFailedError

这种行为的原因是什么?

2 个答案:

答案 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