ori*_*rip 11 java eclipse junit android junit4
我正在为我的Android代码编写一些POJO测试.
我想用JDK本地运行它们(不是在模拟器上使用Dalvik) - 速度,JUnit 4,Mockito,并且能够在没有设备的情况下运行无头 - 所以我在Eclipse中有一个单独的"Java"项目.
如果我正在测试的方法恰好引用Android SDK中的任何内容,例如android.util.Log,测试失败 - 这是有道理的,因为android.jar它不在类路径中.重现我有这个测试用例:
public class FooTests {
@Test
public void testFoo() {
android.util.Log.d("x", "y");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我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)
Run Code Online (Sandbox Code Playgroud)
有没有办法让代码工作而不会嘲笑Android SDK依赖的最后一点?也许android.jar已经存在嘲弄?
编辑:现在我最终将类包装起来android.util.Log并将它们注入到实例中,用于经典的基于IOC的测试.斯科特的PowerMock建议是我需要它的下一步.
稍后编辑:Robolectric!
据我所知,没有模拟的 android.jar 。我使用 Powermock 来模拟一切。为了帮助处理繁重的模拟,您可以做的一件事是使您的扩展 Android 类(如 Activity、Fragment、Broadcasters 等)变薄,并让它们委托给 pojo 类。您可以做出基于风险的决定,不对 Android 扩展类进行隔离单元测试,而是通过 Android 测试框架或其他类似 Robotium 的工具对它们进行集成单元测试。
对于 Android 中真正的隔离单元测试,对我来说,在 java jvm 上进行单元测试,模拟所有协作类是最好的方法。