ActivityResult未返回到检测测试中的调用活动

时间:2012-06-27 18:15:20

标签: android instrumentation android-testing

我正在使用下面介绍的方法来验证我正在测试的Activity是否会启动另一项活动。

Instrumentation.addMonitor (IntentFilter filter, Instrumentation.ActivityResult result, boolean block)

根据文档,block参数控制监视器是否应阻止活动开始(返回其固定结果)。这就是我想要实现的目标 - 我想将AcitivityResult返回给调用活动:onActivityResult()。我使用的代码如下:

Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putLong(ActivityBundleKeys.KEY_TEST, 2L);
resultIntent.putExtras(bundle);
ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultIntent);
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);
mSolo.clickOnView(btnMap); //button properly clicked, activity started
Activity currentActivity = mInstr.waitForMonitor(monitor);

如果我理解正确,如果我将“true”传递给addMonitor(),则应该阻止启动并且我的调用活动应该接收模拟结果。它没有发生。请求的活动正常启动,并在模拟器中可见。结果不会返回到调用活动。有人有类似的问题吗?

2 个答案:

答案 0 :(得分:2)

Solo使用一个内部ActivityMonitor来捕获所有意图,只有第一个匹配的监视器被命中,所以你的活动永远不会被它在Solo的ActivityMonitor之后创建。

您可以通过在Solo之前插入显示器来使其工作,如下所示:

ActivityMonitor soloMonitor = mSolo.getActivityMonitor();
mInstr.removeMonitor(soloMonitor);
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);

// Put back Solo's monitor after yours
mInstr.addMonitor(soloMonitor);

答案 1 :(得分:0)

好的,我设法通过手动返回模拟的意图来解决这个问题:

Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putLong(ActivityBundleKeys.KEY_TEST, 2L);
resultIntent.putExtras(bundle);
ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultIntent);
//Don't know why, but "result" parameter in below call is not used
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);
mSolo.clickOnView(btnMap); 
Activity currentActivity = mInstr.waitForMonitor(monitor);      
currentActivity.setResult(Activity.RESULT_OK, resultIntent);//manually seting the returned intent
currentActivity.finish();
mInstr.waitForIdleSync();