2

我必须在这里遗漏一些明显的东西:

我也在 Robotium 的帮助下在设备上运行仪器测试用例。在某些时候,我正在测试的应用程序会触发默认的电子邮件撰写活动。

我想知道的是:如何关闭该活动以便再次显示我的应用活动?至少出于一个原因需要这样做:在当前测试用例完成后,电子邮件活动仍处于前台,这会阻止下一个测试用例正常运行。

我尝试将所需的返回键发送到电子邮件活动 - 使用this.sendKeys(KeyEvent.KEYCODE_BACK)solo.goBack()- 但没有运气。

如果我运行solo.getCurrentActivity()获得对包中最顶层活动this.getActivity()的引用,但无法获取实际的前台活动。此外,提到的直接进入我的活动,而不是电子邮件。sendKeys/goBack

当我的应用启动 Play Store 主要活动时,也会出现同样的问题。
我意识到电子邮件活动不是我正在测试的包的一部分,这可能是问题的一部分。

那么,有没有办法关闭电子邮件活动?

编辑
现在我坚持@Joe Malin 的第一个建议:

在我的 ViewModel(或 Controller)中,有一个private static boolean _productionMode = true; 并且有一些仅在测试期间使用的辅助方法(如果在某些内部辅助类中更好):

public void dontLaunchExternalApps()
{
  _productionMode = false;
}

然后在一些 ViewModel 常规方法中:

if (_productionMode)
{
   launchSomeExternalApp();
}
else
{
   // Do Nothing Or Set Some Internal Flag
}
4

2 回答 2

1

没有什么好办法。Android 检测框架实际上是为了对 Android 组件进行单元测试。一旦控制权传递出组件,就必须由其他一些框架接管。

也许您可以使用扩展数据启动初始活动,告诉活动发送存根电子邮件 Intent 而不是真实的。真正的问题不是关闭电子邮件活动,而是在模拟它,以便您从中获得您期望得到的东西。不幸的是,Android 组件不支持模拟。解决这个问题的方法是将大多数操作委托给 POJO 子类,然后模拟它们。

于 2012-11-12T20:38:03.083 回答
1

您可以在测试中创建一个意图过滤器来检查正确的意图是否被触发,然后处理返回结果,或者您可以制作一个仅用于测试的应用程序,例如处理电子邮件意图并将其设置为系统默认值的应用程序,这个应用程序实际上可以没有 gui 并自动返回您想要的结果,无论是硬编码的还是基于您可以读取的某个文件,或者甚至作为意图中的额外信息。

这是一个例子:

//set up the filter
final Instrumentation inst = getInstrumentation();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW);
intentFilter.addDataScheme("http");
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE);

//Set up the monitor
//THE BOOLEAN ON THE END TELLS THE SYTEM TO BLOCK IT FROM OCCURING, you probably want true here
ActivityMonitor monitor = inst.addMonitor(intentFilter, null, true);

assertEquals(0,monitor.getHits()); 

//click the link here with whatever framework you are using
solo. clickOnText("link text")

//Wait for the activity to get hit
monitor.waitForActivityWithTimeout(2000); 

//Here is where you actually check it happened
assertEquals(1, monitor.getHits()); 
inst.removeMonitor(monitor);
于 2012-11-14T08:29:15.730 回答