使用Mockito模拟Android应用程序,如联系人应用程序

时间:2012-06-28 12:16:43

标签: android mockito functional-testing

我正在尝试为Android应用程序编写功能测试。问题是我探索过的大多数功能测试框架(calabash-android,robotium)都限制了可以在同一测试中测试的不同应用程序的活动数量。因此,如果在一个工作流程中我需要从android联系人选择器中选择一些联系人我无法测试整个流程,因为联系人选择器活动是android联系人应用程序的一部分,并且框架无法测试我的应用程序和联系人应用程序中的活动在同一时间。

我的团队想到的一个可能的解决方案是模拟对联系人活动的调用,以返回带有联系信息的虚拟意图,以便可以测试我们的应用程序工作流程。我们正在尝试使用mockito来实现这一目标。但是我很早就被困住了。这是我想要做的事情

MyActivity mockActivity = mock(MyActivity.class);
when(mockActivity.startActivityForResult(<?>,anyInt())).thenReturn(fakeIntent);

我不确定在第二行的第一个参数中放入什么。我已经尝试过Intent.class和android.content.Intent.class,但它会抛出编译错误。如果有人使用mockito进行模拟活动,那么将非常感谢一些帮助。

P.S。 - 如果我理解正确,在单元测试中使用的模拟比功能测试更多。所以这些测试更像是一种混合体。如果有人对如何在Android上进行这些功能测试提出了更好的建议,我会全力以赴。

2 个答案:

答案 0 :(得分:0)

如果不知道startActivityForResult方法的签名就很难回答这个问题,但一般的想法是使用any(Xxx.class),其中Xxx是参数的类型。所以要么

when(mockActivity.startActivityForResult(any(Xxx.class),anyInt())).thenReturn(fakeIntent);

或(等同种类)

doReturn(fakeIntent).when(mockActivity).startActivityForResult(any(Xxx.class),anyInt());

答案 1 :(得分:0)

问题在于,您无法真正“模拟”(实际上是“间谍”)您正在测试的活动,因为它是由Android的检测代码创建的。在您可以控制的单元测试环境中,您可以遵循mock(MyActivity.class)spy(myActivityInstance)路径(间谍实际上会更好,因为您可以重复使用该活动的大部分原始实现),但这里不

我发现这种困境的唯一解决方案是将某些功能从活动中移出到实用程序类中,理想情况下使用roboguice@ContextSingleton s可用于处理活动结果)。然后,在您的测试项目中,您将创建自己的测试guice注入器,在第一次调用getActivity()之前将其设置为基本应用程序注入器,然后让活动在您的模拟实用程序类上工作。

I outlined the complete process here.