在 Android Espresso 测试中无法获得 activity under test

Can't get the activity under test in an Android Espresso test

在我们的 Espresso 测试中,我们需要自定义启动意图以传递自定义附加项等。因此,我们将 launchActivity 标志设置为 false:

@Rule
public final ActivityTestRule<CreateQuoteActivity> mActivityRule = new ActivityTestRule<>(
        CreateQuoteActivity.class, true, false
);

现在,我想获得对正在测试的 activity 的引用。如果那个标志是 true,我会使用 mActivityRule.getActivity()。但是,现在 mActivityRule.getActivity() returns null.

如何获得对 activity 的引用?

如果您已将 launchActivity 设置为 false,则只有在您实际启动它时才能访问 activity。

所以,您的 activity 上下文就在那里:

final CreateQuoteActivity activity = mActivityRule.launchActivity(mIntent);

使用 ActivityTestRule 您可以为每个测试配置一个 Intent。

@Test
public void myTest() {
    Intent intent = new Intent();
    intent.putExtra(TAG_EXTRA, XXX);
    mActivityRule.launchActivity(intent);

    //......
}

如果所有测试的意图都相同,您可以在 @Before 方法中进行设置。

@Before
public void setUp() {
    Intent intent = new Intent();
    intent.putExtra(TAG_EXTRA, XXX);
    mActivityRule.launchActivity(intent);
}

如果您启动一个 activity 并在此之后启动第二个,您可以使用已发布的方法 here 获取当前恢复的 activity 实例。

问题的基本代码如下

 public static Activity getActivityInstance() {
   getInstrumentation().runOnMainSync(new Runnable() {
      public void run() {
         Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance()
               .getActivitiesInStage(RESUMED);
         if (resumedActivities.iterator().hasNext()) {
            resumedActivity = (Activity) resumedActivities.iterator().next();
         }
      }
   });
   return resumedActivity;
}