我正在为我的Android代码编写一些POJO测试。
我想使用JDK本地运行它们(而不是在模拟器上的Dalvik)——为了速度,使用JUnit 4、Mockito,并且能够在没有设备的情况下运行headless——因此我在Eclipse中有一个单独的“Java”项目。
如果我要测试的方法恰好引用了来自Android SDK的任何内容,例如
如果我将
我想使用JDK本地运行它们(而不是在模拟器上的Dalvik)——为了速度,使用JUnit 4、Mockito,并且能够在没有设备的情况下运行headless——因此我在Eclipse中有一个单独的“Java”项目。
如果我要测试的方法恰好引用了来自Android SDK的任何内容,例如
android.util.Log
,则测试将失败——这很有道理,因为android.jar
不在类路径中。为了重现这个问题,我有这个测试用例:public class FooTests {
@Test
public void testFoo() {
android.util.Log.d("x", "y");
}
}
如果我将
android.jar
明确添加到测试项目的类路径中,我会遇到以下异常。java.lang.RuntimeException: Stub!
at android.util.Log.d(Log.java:7)
at com.example.FooTests.testFoo(FooTests.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
有没有一种方法可以使代码在不模拟每个Android SDK依赖项的情况下工作?也许已经存在一个模拟的android.jar
?
编辑:目前,我将类(如android.util.Log
)包装并将它们注入实例中进行了传统的基于IOC的测试。当我需要时,Scott的PowerMock建议是我的下一步。
稍后编辑:Robolectric!
android.util.Base64
实现,在测试中使用sun.misc.BASE64Decoder
实现 :) 如果能够简单地拥有一个包含所有库代码的JAR文件,并且只需将与运行环境相关的框架部分替换掉,那将会非常棒。 - orip