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

Jav*_*ano 10 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()));
}
Run Code Online (Sandbox Code Playgroud)

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

app*_*oll 15

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

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

然而,有一种方法来完成你所需要的,像显示在这里.在我的版本中,我还定义了一个断言方法,如:

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

我在测试方法中使用过的.

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

祝好运!

编辑:

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


Be_*_*ive 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);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

这个简短的片段应该工作:

intended(hasComponent(ExpectedActivity.class.getName()));
Run Code Online (Sandbox Code Playgroud)