Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟库/框架在Android中最有效?_Android_Unit Testing_Mocking_Android Testing - Fatal编程技术网

模拟库/框架在Android中最有效?

模拟库/框架在Android中最有效?,android,unit-testing,mocking,android-testing,Android,Unit Testing,Mocking,Android Testing,我正在使用第三方库(Twitter4j)开发Android应用程序。我希望能够在JUnit和功能测试中模拟这些对象(也是我创建的对象) 你有使用一些模拟库的好经验吗?你可以推荐它们吗?是写在著名的Java模拟框架之上的(更新:Mockito从1.9.5版开始增加了对Android的支持,EasyMock从3.2版开始增加了对Android的支持,通过分解运行时生成代码的位并使其可插入,例如使用dexmaker而不是cglib。) 除了Dixon提到的(这是一个相当年轻、未经验证的库),目前还没有

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

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

是写在著名的Java模拟框架之上的(更新:Mockito从1.9.5版开始增加了对Android的支持,EasyMock从3.2版开始增加了对Android的支持,通过分解运行时生成代码的位并使其可插入,例如使用dexmaker而不是cglib。)

除了Dixon提到的(这是一个相当年轻、未经验证的库),目前还没有解决方案。你可以立即忘记任何基于CGLib(,plain)的东西,因为CGLib依赖于字节码生成,而不适用于Dalvik(它还依赖于Java Beans包,它也不是Android的一部分)

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

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


我们在基类中使用JUnit 4+PowerMock+Mockito和模拟类,如Context和TextUtils,我们从基类继承每个普通JUnit测试。对于插装测试,我们创建自定义模拟类,并使用工厂决定哪种实现(模拟或非模拟)在运行时实例化。

我最近发布了Borachio,一个在Android上运行的本机Scala模拟框架

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

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

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

更新:
Borachio现在是。

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

我正在使用easymock 2.5.2(注意-不要使用3.X)。它可以工作-但仅用于模拟接口

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


后来的easymock版本,如easymock 3.x将无法运行,因为它们在类和接口上使用android不兼容的字节码操作,而2.x只在模拟类上使用它。

我刚刚尝试了android Mock。它目前运行得非常好。它解决了我的问题(可以不使用EasyMock而使用AndroidTestCase,也可以使用EasyMock但不允许使用上下文)

Lmock正在Android上工作:

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

[一种常见的方法]是使用模拟框架,例如 Mockito或Android Mock来模拟Android SDK 有效的方法,我们发现,没有机器人分子 测试Android应用程序所需的模拟很快就会产生 本质上是应用程序代码的反向实现

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

下面是它的工作原理:

[它截取]数据的加载 Android类和重写方法体 重新定义Android方法,使其返回null(或0、false等),或 如果提供,Robolectric将把方法调用转发给影子Android 提供Android SDK行为的对象


.

你有使用它的经验吗?使用它的利与弊是什么?我们不久前也发现了这个项目,但它看起来不是很活跃…我不想依赖我使用的东西的预阿尔法版本来验证我的应用程序的行为。弊在于它基于easymockYou写的你使用Mockito来模拟上下文-你是怎么做的与第一段相反(因为它依赖于CGLib,所以无法运行),我们区分在JVM上运行的测试和在仿真器(即Dalvik VM)上运行的测试(UI单元和故事测试)。例如,我们的API连接器依赖于上下文,但该类的单元测试没有在模拟器上执行,因此我们可以使用Mockito和Powermock模拟上下文。但是,任何涉及运行活动的操作都必须在模拟器上运行,而这些库将无法工作。我更新了最后一段,以澄清我们的方法。顺便说一句,这方面有了新的进展,这要感谢Pivotal的家伙们:Robolectric使用“影子类”来允许在标准JVM上对Android框架类进行测试。显然,随着Mockito的1.9.5版本的发布,您可以将其与dexmaker一起用于Android。请参阅