如何从活动场景规则访问活动

2022-09-03 18:13:30

我正在使用Espresso UI测试,我想访问该方法,调用它需要.那么,有没有办法检索 by the ,也许类似于 .ActivityScenarioRulegetStringArray()ActivityActivityActivityScenarioRulegetActivityActivityTestRule

@Rule
    public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);

我没有使用,因为它已被弃用!ActivityTestRule


答案 1

由于看起来您正在使用Java,因此您将如何执行此操作:

@Rule
ActivityScenarioRule<MainActivity> activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);

@Test
public void test() {
    activityScenarioRule.getScenario().onActivity(activity -> {
        // use 'activity'.
    });
}

请阅读文档,了解有关这些与受测活动交互的新方法的详细信息。


答案 2

对于任何想要的人来说,但不需要重写所有测试以在UI线程上运行,这是一种相当简单的Java方法来获取它:Activity

等待 UI

假设您要测试对话框是否在一段时间延迟后显示,钩子在UI线程上运行,这意味着在那里等待将导致对话框显示紧张。onActivity(...)

  • 在这种情况下,您需要保留强引用(因为这会阻止活动关闭)。ActivityScenario
  • 测试应等待钩子被调用,然后保留传递的活动的引用。onActivity(...)
  • 最后,将测试逻辑移出钩子。onActivity(...)

private ActivityScenario mActivityScenario;

@After
public void tearDown() throws Exception {
  if (mActivityScenario != null) {
    mActivityScenario.close();
  }
  mActivityScenario = null;
}

@Override
public Activity getActivity() {
  if (mActivityScenario == null) {
    mActivityScenario = ActivityScenario.launch(getActivityClassForScenario());
  }
  return tryAcquireScenarioActivity(mActivityScenario);
}

protected static Activity tryAcquireScenarioActivity(ActivityScenario activityScenario) {
  Semaphore activityResource = new Semaphore(0);
  Activity[] scenarioActivity = new Activity[1];
  activityScenario.onActivity(activity -> {
    scenarioActivity[0] = activity;
    activityResource.release();
  });
  try {
    activityResource.tryAcquire(15000, TimeUnit.MILLISECONDS);
  } catch (InterruptedException e) {
    Assert.fail("Failed to acquire activity scenario semaphore");
  }
  Assert.assertNotNull("Scenario Activity should be non-null", scenarioActivity[0]);
  return scenarioActivity[0];
}

推荐