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

Android ActivityMonitor失败导致getActivity()永远不会返回,android,unit-testing,Android,Unit Testing,我有一个使用Instrumentation.ActivityMonitor检查是否发送了意图的测试用例。当测试成功时,这可以正常工作。如果断言失败,下一个测试用例将挂起setUp()中的getActivity()调用 我是不是应该打个电话找个方法清理一下 它似乎围绕活动启动而运行,但ActivityMonitor没有捕捉到它。也就是说,没有触发IntentFilter。测试失败,但新的“活动”不会被取消,并且似乎会干扰下一个getActivity()调用 这个问题是,但是这个解决方案(调用sup

我有一个使用Instrumentation.ActivityMonitor检查是否发送了意图的测试用例。当测试成功时,这可以正常工作。如果断言失败,下一个测试用例将挂起setUp()中的getActivity()调用

我是不是应该打个电话找个方法清理一下

它似乎围绕活动启动而运行,但ActivityMonitor没有捕捉到它。也就是说,没有触发IntentFilter。测试失败,但新的“活动”不会被取消,并且似乎会干扰下一个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
    }
}
公共类SimpleActivityTest
扩展ActivityInstrumentationTestCase2{
私人简单活动;
@凌驾
受保护的void setUp()引发异常{
super.setUp();
this.getInstrumentation().setInTouchMode(false);
意图=新意图();
意向。额外(“数据项1”,1);
意向。额外(“数据项2”,2);
此.setActivityIntent(intent);
this.activity=getActivity();//此调用在第二次测试时挂起
}
public void testOtherActivityCalled(){
IntentFilter ifilter=新的IntentFilter(Intent.ACTION\u视图);
ifilter.addDataScheme(“http”);
ifilter.addDataAuthority(“some.domain.com”,null);
ifilter.addDataPath(“foobar”,PatternMatcher.PATTERN_前缀);
ActivityMonitor ActivityMonitor=getInstrumentation().addMonitor(
ifilter,null,false);
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//以某种方式启动其他活动
}
});
getInstrumentation().waitForIdleSync();
Activity otherActivity=activityMonitor.waitForActivityWithTimeout(2000);
assertNotNull(其他活动);
otherActivity.finish();
}
public void testSomethingElse(){
//此代码永远不会运行,因为setUp()中的getActivity()将
//永不回头
}
}

我怀疑您创建的Runnable永远不会退出。因为它是在UI线程上运行的,所以它从不允许活动生命周期执行它需要的操作。您在UI线程中这样做有什么特别的原因吗?

我也有类似的问题,所以我开始使用library。我关闭tearDown()方法中的所有活动:


waitForIdleSync()确保UI线程正常工作。我使用UI线程来做一些事情,比如选择列表或单击按钮。这些点击通过,所以我知道可运行的完成。你解决这个问题了吗?我有同样的问题,不知道如何解决:(
protected void setUp() throws Exception {
        super.setUp();
        mSolo = new Solo(getInstrumentation(), getActivity());
    }
protected void tearDown() {
        mSolo.finishOpenedActivities();
        mSolo.finishInactiveActivities();
    }