我有一个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 jar并且Robolectric仅为更小的一组东西加载Shadow类。这是使用Robolectric进行Android测试的更多原因。
答案 0 :(得分:9)
经过大量谷歌搜索后,我遇到了here的答案。
基本上它涉及使用Robolectric单元测试框架,它拦截Android类的加载。然后你可以继续使用Mockito(虽然在大多数情况下没有必要)并在JVM上运行你的测试!
答案 1 :(得分:2)
从版本1。9。5(2012年6月3日发布)开始,您可以将Mockito与Android配合使用。要做到这一点,你还需要dexmaker:
http://code.google.com/p/dexmaker/
此Wiki页面描述了如何实现它:
答案 2 :(得分:1)
看看android-mock。它基于EasyMock 2.4(因此不如Mockito那么好但是很接近)。
通过在构建时而不是运行时预生成模拟类来解决DalvikVM的局限性,然后在部署到设备时使用编译的测试代码对其进行补充。
还有一个名为Borachio的模拟框架,我无法保证,但看起来很有希望(如果你很高兴能够通过让你的设备运行Scala的动作)。
答案 3 :(得分:1)
对于与Android SDK内部类无关的所有内容,您可以避免使用它。
这就是我为Android项目所做的事情(虽然我使用的是JMock2
,而不是Mockito
)。
我有两个测试项目。
第一个使用JUnit4
和JMock2
,我将自己添加为依赖项。我测试了所有“业务逻辑”类,但我无法测试任何与Android有关的内容(UI类,SQLiteOpenHelper等)如果我尝试在我的测试中使用它们,我会得到可怕的{{1}例外。
第二个使用Stub!
和ActivityInstrumentationTestCase2
来测试用户界面。
这似乎很多工作和复杂,但实际上并非如此,我认为最好将它们分开。 UI测试不是“真正的”单元测试,它们经常测试多个单元的某些功能。如果你正确地将你的UI层与你的业务逻辑分开(并且这样的测试分离将迫使你以TDD风格执行),那么它就会很好而且流畅。