Android Activity 测试 - 测试重启

标签 android unit-testing junit

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/

相关文章:

android - 给信件的一部分上色的最佳方法是什么?

node.js - 使用Sinon 模拟 Knex 查询

java - 为什么 Array.asList 不创建空列表?

java - Apache Camel | Spring 测试|拦截路由不起作用

java - 使用 JUnit 在与 main 相同的类中测试方法

ListView 的 Android 替代颜色是随机的

Android HttpURLConnection 非常慢

unit-testing - 丰富领域模型的接口(interface)

java - 如何在 Java 中表示 TCP 端口范围(16 位)

android - 非根设备 (Android L) 上的设备所有者,没有 NFC,使用 adb shell,dpm set-device-owner