12

我有一个 Java 库,它使用了一些来自 Android API 的东西。我想使用 Mockito 为这个库编写单元测试。

有什么办法可以解决这个问题吗?

Mockito 在 Dalvik VM 上表现不佳,请参阅这篇文章:Using Mockito with Android virtual machine

更新:

自从这篇文章以来,我发现了 Robolectric,并且有机会在 Pivotal Labs 工作,并为这个库做出了一些小的贡献。我建议在 Android 测试框架/mockito 上使用它。此外,您可以自由使用 Robolectric 和 Mockito,但 Robolectric 中的阴影对象使 Mockito 在大多数用例中变得不必要。

尝试对 Android 进行单元测试的问题在于,您构建的 Android 库的每个方法都被存根,要么抛出存根异常,要么返回 null。如果您想测试您的应用程序并想要任何 Android 行为,那么您就不走运了,除非您使用 Robolectric,它会在类加载时动态重写字节码,并注入一个模拟行为的影子对象。

更新 2:

已经有一段时间了,情况发生了变化。Robolectric 中的许多 Shadow 类已替换为真正的 Android 类。现在使用真正的 Android jars,并且 Robolectric 只为更小的一组东西加载 Shadow 类。这也是使用 Robolectric 进行 Android 测试的更多理由。

4

4 回答 4

9

经过多次谷歌搜索,我在这里找到了答案。

基本上它涉及使用Robolectric单元测试框架,它拦截 Android 类的加载。然后您可以继续使用 Mockito(尽管在大多数情况下没有必要)并在 JVM 上运行您的测试!

于 2011-11-17T01:43:26.887 回答
2

从 1.9.5 版(2012 年 6 月 3 日发布)开始,您可以在 Android 上使用 Mockito。为此,您还需要 dexmaker:

http://code.google.com/p/dexmaker/

这个 wiki 页面描述了如何实现它:

http://code.google.com/p/dexmaker/wiki/Mockito

于 2012-06-19T12:01:07.007 回答
1

你可以避免它,因为一切都与 Android SDK 内部类无关。这就是我为我的 Android 项目所做的(尽管我使用JMock2,而不是Mockito)。

我有两个测试项目。

  • 第一个使用JUnit4并且JMock2我将自己添加为依赖项。我测试了所有的“业务逻辑”类,但我无法测试任何与 Android 相关的东西(UI 类、SQLiteOpenHelper 等)。如果我尝试在测试中使用它们,我会得到可怕的Stub!异常。

  • 第二个测试 UI,使用ActivityInstrumentationTestCase2Robotium

这可能看起来工作量很大而且很复杂,但实际上并非如此,而且我实际上认为最好将它们分开。UI 测试不是“真正的”单元测试,它们通常会跨多个单元测试某些功能。如果您正确地将 UI 层与业务逻辑分开(并且以 TDD 风格进行这种测试分离将迫使您这样做),那么一切都很好而且很顺利。

于 2011-11-12T23:34:24.547 回答
1

看看android-mock。它基于 EasyMock 2.4(所以不如 Mockito 好,但很接近)。

它绕过了 DalvikVM 的限制,通过在构建时而不是运行时预先生成模拟类,然后在部署到设备时将它们与编译的测试代码捆绑在一起。

还有一个名为Borachio的模拟框架,我不能保证,但它看起来很有希望(如果你愿意通过让 Scala 在你的设备上运行的动作)。

于 2011-11-11T00:09:10.847 回答