Android:使用robolelectric和Mockito对Android应用程序进行单元测试



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

我有什么办法可以做这件事吗?

Mockito在Dalvik虚拟机上不能很好地运行,参见这篇文章:在Android虚拟机上使用Mockito

更新:

自从这篇文章以来,我发现了robolelectric,我有机会在Pivotal实验室工作,并为这个库做出了一些小贡献。我建议使用这个Android测试框架/mockito。另外,你可以自由地使用Robolectric和Mockito,但是Robolectric中的阴影对象使得大多数用例都不需要Mockito。

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

更新2:

已经有一段时间了,一切都变了。robolelectric中的许多暗影职业已经被真正的Android职业所取代。现在使用的是真正的Android jar,而robolelectric只为一小部分东西加载Shadow类。这是使用Robolectric进行Android测试的更重要的原因。

在谷歌上搜索了很久之后,我找到了一个答案。

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

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

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

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

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

看看android-mock。它基于EasyMock 2.4(虽然没有Mockito那么好,但也很接近)。

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

还有一个名为Borachio的模拟框架,我不能保证,但看起来很有前途(如果你愿意在你的设备上运行Scala)。

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

我有两个测试项目。

  • 第一个使用我自己添加的JUnit4JMock2作为依赖项。我测试了所有的"业务逻辑"类,但我不能测试任何与Android (UI类,SQLiteOpenHelper等)有关的东西,如果我试图在测试中使用它们,我会得到可怕的Stub!异常。

  • 第二个测试UI,使用ActivityInstrumentationTestCase2Robotium

这可能看起来有很多工作和复杂,但实际上并不是,我实际上认为最好把它们分开。UI测试不是"真正的"单元测试,它们经常跨多个单元测试某些功能。如果您正确地将UI层从业务逻辑中分离出来(按照TDD的风格,这样分离测试将迫使您这样做),那么一切都会很顺利。

相关内容

  • 没有找到相关文章

最新更新