答案 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/
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行为的对象。
答案 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但不允许上下文)