如何从 ActivityScenarioRule 访问 Activity

Sat*_*sal 10 java android android-espresso

我正在使用ActivityScenarioRuleEspresso UI 测试,我想访问该方法getStringArray(),调用需要Activity. 那么,有什么方法可以检索Activityby ActivityScenarioRule,也许类似于getActivityin 的东西ActivityTestRule

@Rule
    public ActivityScenarioRule activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);
Run Code Online (Sandbox Code Playgroud)

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

eig*_*tx2 20

由于您似乎在使用 Java,因此您可以这样做:

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

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

请阅读文档以获取有关这些与被测活动交互的新方式的更多信息。

  • 如何从 ActivityTestRule 升级到 ActivityScenarioRule,而不重写每个测试用例以适应此模式? (2认同)

Jul*_*n C 6

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

等待用户界面

假设您想测试一段延迟后是否显示对话框,该onActivity(...)钩子在 UI 线程上运行,这意味着在那里等待会导致对话框无法显示。

  • 在这种情况下,您需要保留对的强引用ActivityScenario(因为这会阻止 Activity 关闭)。
  • 测试应该等待onActivity(...)钩子被调用,然后保留传递的 Activity 的引用。
  • 最后,将测试逻辑移出挂钩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];
}
Run Code Online (Sandbox Code Playgroud)