【问题标题】:Mocking library/framework that works best in Android? [closed]在 Android 中效果最好的模拟库/框架? [关闭]
【发布时间】:2011-03-21 05:34:43
【问题描述】:

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

您在使用一些模拟库方面有什么好的经验,您可以推荐它们吗?

【问题讨论】:

    标签: android unit-testing mocking android-testing


    【解决方案1】:

    (更新: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 测试。对于插桩测试,我们创建自定义模拟类并决定使用工厂在运行时实例化哪个实现(模拟与否)。

    【讨论】:

    • 你已经写过你使用 Mockito 来模拟 Context - 你是怎么做的,这与你的第一段相反(它不能运行,因为它依赖于 CGLib)
    • 我们区分在 JVM 上运行的测试和在模拟器(即 Dalvik VM)上运行的仪器(UI 单元和故事测试)。例如,我们的 API 连接器依赖于 Context,但该类的单元测试并未在模拟器上执行,因此我们可以使用 Mockito 和 Powermock 模拟 Context。任何涉及运行 Activity 的东西都必须在模拟器上运行,而这些库将不起作用。
    • 我更新了最后一段以阐明我们对此的处理方法。
    • 顺便说一句,这要归功于 Pivotal 的人员:Robolectric 使用“影子类”来允许在标准 JVM 上针对 Android 框架类进行测试。 pivotal.github.com/robolectric
    • 显然在 1.9.5 版本的 Mockito 中,您可以将它与 dexmaker 一起使用以在 Android 上工作。见code.google.com/p/mockito/wiki/ReleaseNotes
    【解决方案2】:

    我最近发布了 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

    【讨论】:

      【解决方案3】:

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

      【一种常用的方法】是使用mock框架如 Mockito 或 Android Mock 来模拟 Android SDK。虽然这是一个 有效的方法,我们发现在没有 Robolectric 的情况下, 快速测试 Android 应用程序所需的模拟生成的测试是 本质上是应用程序代码的反向实现。

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

      它是这样工作的:

      [拦截] Android 类和重写方法体。机器人电动 重新定义 Android 方法,使其返回 null(或 0、false 等),或 如果提供 Robolectric 将转发方法调用到影子 Android 提供 Android SDK 行为的对象。

      A comparison to Mockito.

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你有使用它的经验吗?使用它有什么优缺点?
        • 我们不久前也发现了那个项目,但它看起来不是很活跃......我宁愿不依赖我用来验证我的应用程序行为的东西的 pre-alpha 版本。
        • 一个骗局是它基于easymock
        【解决方案5】:

        Lmock 正在 Android 上运行:github.com/vmware/lmock

        【讨论】:

          【解决方案6】:

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

          我使用的是 easymock 2.5.2(注意 - 不要使用 3.X)。它可以工作 - 但仅适用于模拟界面

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2010-09-06
              • 2017-10-16
              • 1970-01-01
              • 2010-10-07
              • 1970-01-01
              • 2010-09-09
              • 1970-01-01
              • 2011-07-16
              • 1970-01-01
              相关资源
              最近更新 更多