嘲笑在Android中效果最好的库/框架?
我正在使用第三方库(Twitter4j)开发Android应用程序。 我希望能够在JUnit和functiontesting中模拟这些对象(也是我创build的对象)。
你有什么好的经验,使用一些嘲笑图书馆,你可以推荐他们?
(更新:Mockito从版本1.9.5开始添加了Android支持,EasyMock从3.2版本开始增加Android支持,通过分解那些在运行时生成代码并使它们可插入的位(例如,通过使用dexmaker而不是cglib)。
除了DixonD(这是一个相当年轻,未经证实的库)提到的android-mock ,目前没有解决scheme。 因为CGLib依靠字节码生成,并且不能在Dalvik上工作(它也依赖于Java Beans包,它也不是Android的一部分),所以你可以马上忘记基于CGLib( Mockito ,简单的EasyMock )的任何东西。
对于什么是值得的,你可以使用Android中很less的模拟类(如MockContext ),但是它们不会validation行为,它们只是存根(stub)。 他们的默认行为是在每个方法中抛出一个运行时错误,所以你必须inheritance它们并覆盖你想要模拟的方法。
但是,仍然可以在非仪器testing中使用模拟库,即在JVM上执行的标准unit testing中。 你可以使用PowerMock来模拟框架方法,它支持模拟静态方法和构造函数,使得模拟像Ruby中一样强大(使用起来更加痛苦)。
我们使用JUnit 4 + PowerMock + Mockito,在我们inheritance每一个正常的JUnittesting的基类中模拟出像Context和TextUtils这样的类。 对于工具testing,我们创build自定义的模拟类,并决定使用工厂的实现(模拟或不是)在运行时实例化。
我最近发布了Borachio,一个在Android上运行的本地Scala模拟框架。
因为Borachio是用Scala编写的,所以你需要在Scala中编写你的testing。 但它可以用来testing用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 。
Robolectric使用不同的方法。 它不是在DVM上运行,而是“定义”Android SDK,以便您可以使用JUnit4框架直接在JVM上运行Androidtesting。 testing显然build立和运行得更快,并且需要更less的嘲弄。
[一种常见的方法]是使用模拟框架,如Mockito或Android Mock来模拟Android SDK。 虽然这是一个有效的方法,但我们发现,如果没有Robolectric,testingAndroid应用程序所需的嘲笑程度会迅速产生testing,这些testing本质上是应用程序代码的反向实现。
Robolectric允许testing风格接近黑盒testing,使得testing更有效地进行重构,并允许testing专注于应用程序的行为,而不是实施Android。 如果你愿意,你还可以和Robolectric一起使用模拟框架。
这是如何工作的:
[拦截]加载Android类并重写方法体。 Robolectric重新定义了Android方法,以便它们返回null(或0,false等),或者如果提供的话Robolectric将转发方法调用来影响Android对象,从而提供Android SDK行为。
与Mockito的比较 。
Android Mock是在EasyMock 2.4的基础上编写的,这是为Java所熟知的模拟框架
Lmock正在开发Android: github.com/vmware/lmock
更新:看起来像easymock 3.2添加了一个选项插入cglib的替代品。
我使用easymock 2.5.2(注意 – 不要使用3.X)。 它的工作原理 – 但仅限于嘲笑界面 。
因此,如果你的库暴露了接口,或者你愿意用接口封装我们的依赖,你可以使用easymock。
后来easymock版本,如easymock 3.x 将不起作用,因为他们使用Android不兼容的cglib字节码操作的类和接口,而2.x只用于嘲笑类。
我刚刚尝试过Android-Mock。 目前为止效果很好。 它解决了我的问题(使用没有EasyMock的AndroidTestCase,或使用EasyMock,但没有上下文允许)