2012-11-12 45 views
2

我必须缺少明显的东西在这里:涉及Android系统的仪器测试应用程式

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

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

我试图发送所需的后退键到电子邮件活动 - 与this.sendKeys(KeyEvent.KEYCODE_BACK)solo.goBack() - 但没有运气。

如果我运行solo.getCurrentActivity()this.getActivity()我得到一个参考包内最上面活动,但没办法得到的实际前景活动的举行。另外,提到的sendKeys/goBack直接去了我的活动,而不是电子邮件。

当我的应用程序启动Play商店主要活动时出现同样的问题。
我意识到电子邮件活动不是我测试的软件包的一部分,这可能是问题的一部分。

那么,有没有办法关闭电子邮件提示?

编辑
现在我坚持@Joe马林第一个建议:

在我的视图模型(或Controller),有private static boolean _productionMode = true; ,并且有一定的辅助方法(在某些内助更好,如果

public void dontLaunchExternalApps() 
{ 
    _productionMode = false; 
} 

然后,在一些视图模型常规方法:

if (_productionMode) 
{ 
    launchSomeExternalApp(); 
} 
else 
{ 
    // Do Nothing Or Set Some Internal Flag 
} 
类)仅测试期间使用的

回答

1

没有好办法做到这一点。 Android工具框架真的是要单元测试一个Android组件。一旦控制传出组件,其他一些框架必须接管。

也许你可以开始扩展数据,告诉活动发送电子邮件存根意图,而不是一个真正的初始活性。真正的问题是没有关闭电子邮件活动,它是嘲笑,这样你就可以回到你期望的回报。不幸的是,Android组件不支持模拟。围绕是最委托操作POJO的子类,然后嘲笑他们的方式。

+0

感谢你回答。我已经进行了单元测试组件,TDD-ing以及运行集成/功能测试。我所说的测试实际上是一项功能测试。 我知道你的第一个建议基本上是让活动检测到它在测试模式下运行,所以不要真正启动电子邮件编辑器,而是从外部做一些其他测试。这可能是一种方式... – superjos

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); 
+0

谢谢。在我的情况下,我不想从外部应用程序/活动返回任何结果。 我应该创建一个完整的应用程序(即使很简单),仅用于测试目的,根据我的说法(已经有3个仅用于测试的项目:单元,集成,功能)有点太过分了。此外,我不喜欢手动将此应用程序设置为默认电子邮件。我宁愿保持测试环境尽可能简单和自动化。 – superjos

+0

如果你不想要任何东西,那么你应该在仪器测试中创建一个意图过滤器。这就像六行代码,并且不必在实际的应用程序中输入大量无用的代码。 –

+0

uhm。但是,我想我应该手动进入设备并将该仪器应用程序设置为电子邮件意图的默认“处理程序”,否则我想在测试期间出现一个弹出窗口,询问我是否要打开电子邮件应用程序或我的入侵应用程序。 是吗? – superjos