我正在使用下面介绍的方法来验证我正在测试的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(),则应该阻止启动并且我的调用活动应该接收模拟结果。它没有发生。请求的活动正常启动,并在模拟器中可见。结果不会返回到调用活动。有人有类似的问题吗?
答案 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();