Android活动测试 - 测试重启

Hex*_*ugs 2 junit android unit-testing

在Android开发人员文档中标题为"添加状态管理测试" 的测试基础活动测试部分中,它建议使用以下命令重新启动测试活动:

mActivity.finish();
mActivity = this.getActivity();
Run Code Online (Sandbox Code Playgroud)

尝试在上面两个语句之间添加一个休眠时,我可以看到当执行mActivity = this.getActivity()时,屏幕上没有重绘活动.我的测试似乎有效,但我很感兴趣为什么不在屏幕上重新绘制Activity,因为API文档中似乎没有提到.

我很感激任何人都可以给予的洞察力.调用finish()方法时,Activity会从屏幕上消失,但在调用this.getActivity()时不会重新出现.我也尝试在getActivity()之后添加一个mActivity.setVisible(true),但这没有用.

我的代码片段现在是:

...
mActivity.finish();
Thread.sleep(5000);
mActivity = this.getActivity();
Thread.sleep(5000);
...
Run Code Online (Sandbox Code Playgroud)

我进行了广泛的搜索,但是在调用getActivity()时找不到为什么Activity不再出现的任何解释.

我已经在Android 2.3.5,2.3.3和2.2.2上测试了这一切,结果相同.

小智 8

似乎ActivityExnstrumentationTestCase2类需要一个额外的finish方法,其中必须进行一些清理.同时,您可以通过在完成活动后清理自己来解决此问题.因此,请按以下方式更改代码:

mActivity.finish();
setActivity(null);
mActivity = this.getActivity();
Run Code Online (Sandbox Code Playgroud)

这可以解释如下.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;
}
Run Code Online (Sandbox Code Playgroud)

方法setActivity设置内部变量mActivityIntent.

public void setActivityIntent(Intent i) {
    mActivityIntent = i;
}
Run Code Online (Sandbox Code Playgroud)

第一次调用后的所有调用现在将使用新值mActivityIntent而不是null值.结果是

a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent);
Run Code Online (Sandbox Code Playgroud)

将被召唤.可能您的应用无法以此意图启动.

请注意,方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)