我正在为我的Android代码编写一些POJO测试。我想要在JDK本地运行它们(不适用于模拟器上的Dalvik) - 对于速度,JUnit 4,Mockito以及无需设备就可以运行无头程序 - 因此我有一个单独的“Java”项目蚀。使用JUnit和JDK测试Android代码
如果我测试的方法恰好引用了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建议是我的下一步。
LATER EDIT:Robolectric!
+1好点,我会尝试PowerMock。除https://sites.google.com/site/androiddevtesting/之外的任何相关链接? – orip
我之前没有看到该链接,但它非常出色,感谢分享,当我试图找出模拟android jar类所需的各种方法时,我发现自己经常在他们的网站上引用Powermock“usage”部分:http://code.google.com/p/ powermock /。 – Scott