时间:2010-07-26 17:53:37

标签: android unit-testing mocking android-testing

7 个答案:

答案 0 :(得分:37)

(更新: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测试。对于检测测试,我们创建自定义模拟类,并决定使用工厂在运行时实现(无论是否模拟)。

答案 1 :(得分:7)

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

UPDATE:

Borachio现在是ScalaMock

答案 2 :(得分:3)

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

  

[一种常见的方法]是使用模拟框架,如   Mockito或Android Mock嘲笑Android SDK。虽然这是一个   有效的方法,我们发现没有Robolectric的水平   需要快速测试Android应用程序的模拟产生的测试   本质上是反向应用程序代码的实现。

     

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

以下是它的工作原理:

  

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

A comparison to Mockito

答案 3 :(得分:1)

Android Mock写在EasyMock 2.4之上,这是众所周知的Java模拟框架

答案 4 :(得分:1)

更新:看起来像easymock 3.2为cglib添加了一个插入替代选项。

我正在使用easymock 2.5.2(注意 - 不要使用3.X)。它有效 - 但仅用于模拟界面

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

稍后easymock版本(例如easymock 3.x )将无效,因为它们使用android-incompatible cglib进行类和接口的字节码操作,而2.x仅使用它用于嘲弄课程。

答案 5 :(得分:1)

Lmock正在使用Android:github.com/vmware/lmock

答案 6 :(得分:0)

我刚试过Android-Mock。到目前为止,它运作良好。它解决了我的问题(使用没有EasyMock的AndroidTestCase,或使用EasyMock但不允许上下文)