测试一个最近启动的活动是否已经启动

3

我在 Stack Overflow 上看到了一些类似的问题,但是还没有成功测试过。

Android - 测试是否启动了另一个活动

我尝试了这种方法,但对于我来说,origactivity 结果为空,所以我使用 .baseIntent.getComponent() 来确定启动的活动(我想这应该会给我相同的结果)。

我的 JUnit 测试代码:

public class MainMenuTest extends
        ActivityInstrumentationTestCase2<MainMenuActivity> {

    public MainMenuTest() {
        super("package.name", MainMenuActivity.class);
    }

    private MainMenuActivity mActivity;
    private ActivityManager am;

    public void setUp() throws Exception {
        super.setUp();
        mActivity = this.getActivity();
        am = (ActivityManager) mActivity.getSystemService(Service.ACTIVITY_SERVICE);
        Intent i = new Intent(mActivity, GameActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        mActivity.startActivity(i);
    }

    public void testNewGameButton() {
        final ActivityManager am2 = am;

        mActivity.runOnUiThread(new Runnable() {
            public void run() {                 
                List<ActivityManager.RecentTaskInfo> processes = am2.getRecentTasks(2, ActivityManager.RECENT_WITH_EXCLUDED);
                ActivityManager.RecentTaskInfo recentTask = processes.get(0);
                assertEquals(recentTask.baseIntent.getComponent().getClassName(), GameActivity.class.getName());
            }
        });
    }
}

不幸的是,这会导致assertEquals(recentTask.baseIntent.getComponent().getClassName(),断言失败。

为什么会这样,并且有更好的测试方法吗?

1个回答

3
断言失败是因为ActivityManager.getRecentTasks(...)返回导致新任务创建的活动,而在您的情况下,这是MainMenuActivity而不是GameActivity。您可以像这样使用Instrumentation.ActivityMonitor

public class MainMenuTest extends
        ActivityInstrumentationTestCase2<MainMenuActivity> {

    public MainMenuTest() {
        super("package.name", MainMenuActivity.class);
    }

    private MainMenuActivity mActivity;
    private ActivityMonitor mGameActivityMonitor;

    public void setUp() throws Exception {
        super.setUp();
        mActivity = this.getActivity();
        Intent i  = new Intent(mActivity,
                GameActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // Add a monitor before we start the activity
        mGameActivityMonitor = 
                new ActivityMonitor(GameActivity.class.getName(), null, false);
        getInstrumentation().addMonitor(mGameActivityMonitor);

        mActivity.startActivity(i);
    }

    public void testNewGameButton() {
        // Use the monitor to ensure the activity was started
        Activity activity = mGameActivityMonitor.waitForActivityWithTimeout(5 * 1000);
        assertNotNull("Activity was not started", activity);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接