Android ActivityMonitor 失败导致 getActivity() 永远不会返回。

6
我有一个测试用例,使用Instrumentation.ActivityMonitor来检查是否发送了一个Intent。当测试成功时,这个方法运行良好。如果断言失败,那么下一个测试用例会在setUp()中的getActivity()调用处停滞不前。
我应该调用某些方法进行清理吗?
似乎涉及到了一个Activity的启动,但ActivityMonitor没有捕捉到它。也就是说,IntentFilter没有触发。测试失败,但新的Activity从未被关闭,看起来会干扰下一个getActivity()的调用。
这个问题类似于另一个问题,但是那里的解决方案(调用super.tearDown())并没有解决我的问题。
public class SimpleActivityTest
    extends ActivityInstrumentationTestCase2<SimpleActivity> {

    private SimpleActivity activity;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        this.getInstrumentation().setInTouchMode(false);

        Intent intent = new Intent();
        intent.putExtra("DATA_ITEM_1", 1);
        intent.putExtra("DATA_ITEM_2", 2);
        this.setActivityIntent(intent);

        this.activity = getActivity(); // this call hangs on second test
    }

    public void testOtherActivityCalled() {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_VIEW);
        ifilter.addDataScheme("http");
        ifilter.addDataAuthority("some.domain.com", null);
        ifilter.addDataPath("foobar", PatternMatcher.PATTERN_PREFIX);

        ActivityMonitor activityMonitor = getInstrumentation().addMonitor(
                ifilter, null, false);

        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // launch other activity somehow
            }
        });
        getInstrumentation().waitForIdleSync();

        Activity otherActivity = activityMonitor.waitForActivityWithTimeout(2000);
        assertNotNull(otherActivity);
        otherActivity.finish();
    }

    public void testSomethingElse() {
        // This code will never run because getActivity() in setUp() will
        // never return
    }
}

你解决了这个问题吗?我也遇到了同样的问题,不知道该怎么解决 :( - dexxtr
2个回答

1

怀疑你创建的Runnable从未退出。由于它在UI线程上运行,它永远不允许Activity生命周期执行所需的操作。您是否有特别的原因要从UI线程执行此操作?


waitForIdleSync() 确保 UI 线程完成工作。我使用 UI 线程来进行诸如进行列表选择或单击按钮之类的操作。这些点击会被执行,因此我知道 Runnable 完成了。 - Cristian

0

我遇到了类似的问题,所以开始使用Robotium库。 我在tearDown()方法中关闭所有活动:

protected void setUp() throws Exception {
        super.setUp();
        mSolo = new Solo(getInstrumentation(), getActivity());
    }
protected void tearDown() {
        mSolo.finishOpenedActivities();
        mSolo.finishInactiveActivities();
    }

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