在 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;
}
在我们的 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;
}