我必须遗漏一些明显的东西:
我正在设备上运行一个仪器测试用例,也是在Robotium的帮助下。在某些时候,我的测试应用程序会导致默认的电子邮件撰写活动。
我想知道的是:如何关闭该活动以便再次显示我的应用活动?这需要至少,原因之一是:在当前测试用例完成后,电子邮件活动仍然在前台,这可以防止下一个测试用例正常运行。
我尝试将所需的后退密钥发送到电子邮件活动 - 使用this.sendKeys(KeyEvent.KEYCODE_BACK)
或solo.goBack()
- 但没有运气。
如果我运行solo.getCurrentActivity()
或this.getActivity()
,我会在我的包中找到对最顶层活动的引用,但无法获得保留实际的前景活动。此外,提到的sendKeys/goBack
直接进入我的活动,而不是电子邮件。
当我的应用启动Play商店主要活动时,会出现同样的问题 我意识到电子邮件活动不是我测试的软件包的一部分,这可能是问题的一部分。
那么,有没有办法关闭电子邮件活动?
修改
现在我坚持@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
}
答案 0 :(得分:1)
没有好办法。 Android检测框架实际上是用于对Android组件进行单元测试。一旦控制权从组件中传出,其他一些框架就必须接管。
也许您可以使用扩展数据启动初始活动,该数据告诉Activity发送存根电子邮件Intent而不是真实电子邮件。真正的问题不是关闭电子邮件活动,而是嘲笑它,以便您从中获得您期望的回复。不幸的是,Android组件不支持模拟。围绕 的方式是将大多数操作委托给POJO子类然后模拟它们。
答案 1 :(得分: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);