在 Testing Fundamentals 中和 Activity Testing Android 开发人员文档中标题为“添加状态管理测试”的部分,它建议使用以下方法重新启动测试 Activity :
mActivity.finish();
mActivity = this.getActivity();
通过在上面的两个语句之间添加一个 sleep 来尝试这个,我可以看到当执行 mActivity = this.getActivity() 时,Activity 没有在屏幕上重绘。我的测试似乎有效,但我很好奇为什么 Activity 没有在屏幕上重绘,因为 API 文档中似乎没有提到这一点。
如果任何人都可以提供对此的任何见解,我将不胜感激。在调用 finish() 方法时,Activity 从屏幕上消失,但在调用 this.getActivity() 时不会重新出现。我也试过在 getActivity() 之后放置 mActivity.setVisible(true),但这没有帮助。
我的代码 fragment 现在是:
...
mActivity.finish();
Thread.sleep(5000);
mActivity = this.getActivity();
Thread.sleep(5000);
...
我进行了广泛的搜索,但找不到任何关于为什么在调用 getActivity() 时 Activity 没有重新出现的解释。
我已经在 Android 2.3.5、2.3.3 和 2.2.2 上测试过,结果都一样。
最佳答案
似乎类 ActivityInstrumentationTestCase2 需要一个额外的完成方法,其中必须完成一些清理工作。与此同时,您可以通过在完成 Activity 后清理自己来解决这个问题。因此,按如下方式更改您的代码:
mActivity.finish();
setActivity(null);
mActivity = this.getActivity();
这可以解释如下。类 ActivityInstrumentationTestCase2 中的方法 getActivity 调用 setActivity(a)
public T getActivity() {
Activity a = super.getActivity();
if (a == null) {
// set initial touch mode
getInstrumentation().setInTouchMode(mInitialTouchMode);
final String targetPackage =
getInstrumentation().getTargetContext().getPackageName();
// inject custom intent, if provided
if (mActivityIntent == null) {
a = launchActivity(targetPackage, mActivityClass, null);
} else {
a = launchActivityWithIntent(targetPackage,
mActivityClass,
mActivityIntent);
}
setActivity(a);
}
return (T) a;
}
方法setActivity 设置内部变量mActivityIntent。
public void setActivityIntent(Intent i) {
mActivityIntent = i;
}
第一次调用之后的所有调用现在都将使用新值 mActivityIntent 而不是空值。结果
a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent);
将被调用。可能无法使用此 Intent 启动您的应用。
请注意,rearDown 方法会进行适当的清理:
protected void tearDown() throws Exception {
// Finish the Activity off (unless was never launched anyway)
Activity a = super.getActivity();
if (a != null) {
a.finish();
setActivity(null);
}
}
关于Android Activity 测试 - 测试重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846615/