【问题标题】:Is there any way to know if an activity has been started with Espresso?有什么方法可以知道是否使用 Espresso 开始了一项活动?
【发布时间】:2016-10-08 01:33:12
【问题描述】:

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

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()));
}

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

【问题讨论】:

    标签: android android-espresso


    【解决方案1】:

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

    同时,框架阻止直接访问应用程序的活动和视图,因为在 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),但这并不一定意味着第二个活动正确显示了它的所有视图。您仍然应该检查它们是否被显示,这会让您回到开始的地方。

    【讨论】:

    【解决方案2】:

    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);
    

    这看起来并不比您的方法更好,而且如果您之前的活动在单击注册按钮后正在执行任何工作,它也可能会不稳定并受制于竞争条件。

    【讨论】:

      【解决方案3】:

      这个简短的 sn-p 应该可以工作:

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

      【讨论】:

        【解决方案4】:

        你可以这样做:

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

        response from @riwnodennyk抢劫

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 2018-05-31
          • 2013-04-07
          • 2020-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多