1

我正在尝试为 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 进行过模拟活动,我们将不胜感激。

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

4

2 回答 2

0

在不知道方法签名的情况下很难回答这个问题startActivityForResult,但总体思路是使用any(Xxx.class),其中Xxx是参数的类型。所以要么

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

或(等价的)

doReturn(fakeIntent).when(mockActivity).startActivityForResult(any(Xxx.class),anyInt());
于 2012-06-29T06:46:32.987 回答
0

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

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

我在这里概述了完整的过程。

于 2013-10-09T07:16:44.800 回答