我正在测试包含多个活动的应用程序的快乐路径。为了简单起见,假设我有三个活动。
我的问题是第二步:
{
...
// first activity
onView(withId(R.id.btnBooking)).perform(click());
// second activity
secondActivity_checkInitialViewsState();
// third activity
thirdActivity_checkInitialViewsState();
}
private void secondActivity_checkInitialViewsState()
{
// viewsMustBeVisible
onView(withId(R.id.title)).check(matches(isCompletelyDisplayed())); // <= Error
onView(withId(R.id.sonarView)).check(matches(isCompletelyDisplayed()));
onView(withId(R.id.cancelBooking)).check(matches(isCompletelyDisplayed()));
onView(withId(R.id.listView)).check(matches(isDisplayed()));
// viewsMustBeEnabled
onView(withId(R.id.tvNoServiceFound)).check(matches(not(isCompletelyDisplayed())));
onView(withId(R.id.tvNextSearch)).check(matches(not(isCompletelyDisplayed())));
}
运行测试后,我的日志中出现以下错误:
android.support.test.espresso.NoMatchingViewException:没有视图 层次结构找到匹配:用id:com.my.package:id / title如果 目标视图不是视图层次结构的一部分,您可能需要使用 Espresso.onData从以下之一加载它 AdapterViews:com.google.maps.api.android.lib6.e.n {291fbd0f G.ED..C。 ......一世。 0,0-0,0}
背后的原因是(我认为至少)Espresso框架等待当前消息队列中的UI事件进行处理,并在进入下一个测试操作并且不使用任何时间同步之前完成默认的AsyncTasks。因此,一旦我的后端发送sucess
,当Espresso尝试运行secondActivity_checkInitialViewsState()
时,该应用会显示第三个屏幕并显示该错误。
所以我的问题是,有没有办法让Espresso首先运行这个方法(即使在不同的线程中)。
答案 0 :(得分:0)
Espresso并不是真正意味着在这样的活动中进行测试,它意味着单独测试一个Activity,否则你最终会得到片状测试。这就是Google为我们创建ActivityTestRule
使用的原因。您的“快乐路径”测试应该是三种不同的Espresso测试类:
第一个测试应该测试按下按钮启动第二个Activity,使用espresso-intents:
intended(hasComponent(new ComponentName(getTargetContext(), SecondActivity.class)));
第二个测试应测试您的步骤2.您可以模拟发送到Activity的intent数据。同样,您应该检查是否已启动第三个活动。
最后一次测试应该测试你的第3步。