有没有办法知道Espresso是否已启动活动?

时间:2015-06-17 12:35:35

标签: android android-espresso

我正在使用Espresso进行活动转换测试,但我不知道这是否是最好的方法:

public void testStartLogin() {
    onView(withId(R.id.register)).perform(click());
    onView(withId(R.id.login_password)).check(matches(isDisplayed()));
    onView(withId(R.id.login_show_password)).check(matches(isDisplayed()));
}

最后两个来自第二个活动,但这对我来说太可怕了。有什么不同的方式吗?

4 个答案:

答案 0 :(得分:14)

对某个属于某个特定活动的视图断言某些内容在我看来是一种非常优雅的方式,可以检查该特定活动是否已经启动。来自官方文档:

  

同时,框架阻止直接访问应用程序的活动和视图,因为保留这些对象并在UI线程上对它们进行操作是测试片段的主要来源。因此,您不会在Espresso API中看到像getView和getCurrentActivity这样的方法。

但是,有一种方法可以实现您的需求,如here所示。在我的版本中,我还定义了一个断言方法,如:

 public void assertCurrentActivityIsInstanceOf(Class<? extends Activity> activityClass) {
    Activity currentActivity = getActivityInstance();
    checkNotNull(currentActivity);
    checkNotNull(activityClass);
    assertTrue(currentActivity.getClass().isAssignableFrom(activityClass));
}

我在测试方法中使用的。

对于我自己的测试,我没有任何问题使用它(Espresso 2.0!),但它使它有点多余,因为我仍然会检查属于该活动的视图。所以它有效,但我不推荐它。

祝你好运!

编辑

还有可能检查意图是否从第一个活动发送到第二个活动(检查this short tutorial),但这并不一定意味着第二个活动正确显示了所有视图。您仍应检查它们是否正在显示,这会将您带回到您开始的位置。

答案 1 :(得分:8)

Espresso作者不鼓励访问实际活动以确定应用的状态。

就像真实用户不知道他们面前有什么活动一样,他们通过查看屏幕上的元素来确定他们在应用程序中的位置。我不认为你现在的做法看起来很可怕。

然而,espresso附带ActivityLifecycleMonitor跟踪活动的状态。您可以访问它并执行断言,如下所示:

final Activity[] activity = new Activity[1];

InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
           activity[0] =Iterables.getOnlyElement(ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED));
}

assertTrue(activity instanceof MyActivity.class);

哪种方式看起来不比你的方法更好看,如果你之前的活动在点击注册按钮之后做了任何工作,它也可能是不稳定的,并且会受到竞争条件的限制。

答案 2 :(得分:5)

这个简短的片段应该有效:

intended(hasComponent(ExpectedActivity.class.getName()));

答案 3 :(得分:0)

你可以这样做:

intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class)));

response from @riwnodennyk

点击