35

我正在使用第三方库 (Twitter4j) 开发 Android 应用程序。我希望能够在 JUnit 和功能测试中模拟这些对象(也是我创建的对象)。

你有使用一些模拟库的好经验,你可以推荐它们吗?

4

7 回答 7

38

(更新:Mockito 从 1.9.5 版开始添加了 Android 支持,EasyMock 从 3.2 版开始添加了 Android 支持,方法是将那些在运行时生成代码的位分解并使其可插入,例如使用 dexmaker 而不是 cglib。)

除了DixonD 提到的android-mock(这是一个相当年轻,未经证实的库),目前没有解决方案。你可以立即忘记任何基于 CGLib(Mockito,plain EasyMock)的东西,因为 CGLib 依赖于字节码生成并且不能在 Dalvik 上工作(它也依赖于 Java Beans 包,它也不是 Android 的一部分)。

对于它的价值,您可以使用 Android 附带的极少数模拟类(如MockContext),但它们不验证行为,它们只是存根。它们的默认行为是在每个方法中抛出运行时错误,因此您必须对它们进行子类化并覆盖您要模拟的方法。

但是,您仍然可以在非仪器测试中使用模拟库,即在 JVM 上执行的标准单元测试中。您可以使用PowerMock来模拟框架方法,它支持模拟静态方法和构造函数,使模拟像在 Ruby 中一样强大(只是使用起来更痛苦)。

我们使用 JUnit 4 + PowerMock + Mockito 并在一个基类中模拟出 Context 和 TextUtils 等类,我们从该基类中继承每个正常的 JUnit 测试。对于仪器测试,我们创建自定义模拟类并决定使用工厂在运行时实例化哪个实现(模拟或不模拟)。

于 2010-08-05T07:43:33.820 回答
7

我最近发布了 Borachio,这是一个适用于 Android 的原生 Scala 模拟框架。

因为 Borachio 是用 Scala 编写的,所以您需要用 Scala 编写测试。但它可用于测试用 Java 编写的代码。

在我的博客上有关于如何在 Android 上使用 Borachio 的描述:

http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-1/ http://www.paulbutcher.com/2011/03/mock-objects-on- android-with-borachio-part-2/ http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-3/

更新:

Borachio 现在是ScalaMock

于 2011-03-13T17:37:43.100 回答
3

Robolectric使用了不同的方法。它不是在 DVM 上运行,而是对 Android SDK 进行“defangs”,以便您可以使用 JUnit4 框架直接在 JVM 上运行 Android 测试。测试显然构建和运行得更快,并且需要更少的模拟。

[一种常见的方法]是使用Mockito或Android Mock等模拟框架来模拟Android SDK。虽然这是一种有效的方法,但我们发现,如果没有 Robolectric,测试 Android 应用程序所需的模拟级别会快速产生基本上是应用程序代码反向实现的测试。

Robolectric 允许更接近黑盒测试的测试风格,使测试更有效地重构,并允许测试专注于应用程序的行为而不是 Android 的实现。如果您愿意,您仍然可以使用模拟框架和 Robolectric。

以下是它的工作原理:

【拦截】Android类的加载和方法体的重写。Robolectric 重新定义了 Android 方法,因此它们返回 null(或 0、false 等),或者如果提供,Robolectric 会将方法调用转发到影子 Android 对象,从而提供 Android SDK 行为。

与 Mockito 的比较

于 2013-02-01T23:09:34.763 回答
1

Android Mock是在EasyMock 2.4之上编写的, EasyMock是著名的 Java 模拟框架

于 2010-08-03T21:52:06.183 回答
1

更新:看起来easymock 3.2为cglib的插件替代品添加了一个选项。

我正在使用 easymock 2.5.2(注意 - 不要使用 3.X)。它有效 - 但仅适用于模拟接口

因此,如果您的库公开了接口,或者如果您愿意使用接口包装我们的依赖项,您可以使用 easymock。

后来的 easymock 版本(如 easymock 3.x)将无法工作,因为它们使用与 android 不兼容的cglib对类和接口进行字节码操作,而 2.x 仅将其用于模拟类。

于 2011-05-19T08:19:41.887 回答
1

Lmock 正在 Android 上工作:github.com/vmware/lmock

于 2012-08-28T16:25:20.947 回答
0

我刚刚尝试过 Android-Mock。到目前为止效果很好。它解决了我的问题(要么使用没有 EasyMock 的 AndroidTestCase,要么使用 EasyMock 但不允许上下文)

于 2011-09-23T10:10:42.550 回答