Robolectric坦克在加载JNI库的Application对象上.我可以获得解决方法吗?

Chr*_*rry 9 android unit-testing robolectric

Application我的Android应用程序的对象加载了一个JNI库,而Robolectric似乎并不喜欢这样.当我去运行我的测试时,Robolectric出来了,我得到了这个堆栈跟踪:

java.lang.UnsatisfiedLinkError中:没有cperryinc-JNI在java.lang.Runtime.loadLibrary0(Runtime.java:823)在java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)中的java.library.path在java.lang中.System.loadLibrary(System.java:1045)在com.cperryinc.application.MoolaApplication.(MoolaApplication.java:24)在java.lang.Class.forName0(本机方法)在java.lang.Class.forName(类.的java:169)在com.xtremelabs.robolectric.internal.ClassNameResolver.safeClassForName(ClassNameResolver.java:36)在com.xtremelabs.robolectric.internal.ClassNameResolver.resolve(ClassNameResolver.java:15)在com.xtremelabs.robolectric.ApplicationResolver .newApplicationInstance(ApplicationResolver.java:71)位于com.xtremelabs.robolectric的com.xtremelabs.robolectric.ApplicationResolver.resolveApplication(ApplicationResolver.java:28)com.xtremelabs.robolectric.RobolectricTestRunner.createApplication(RobolectricTestRunner.java:483). com.com上的RobolectricTestRunner.setupApplicationState(RobolectricTestRunner.java:360)tremelabs.robolectric.RobolectricTestRunner.internalBeforeTest(RobolectricTestRunner.java:299)位于org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)的com.xtremelabs.robolectric.RobolectricTestRunner.methodBlock(RobolectricTestRunner.java:277) .junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:193) org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:52)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java) :42)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:184)org.junit.runners.ParentRunner.run(ParentRunner.java:236)org.junit.runner.JUnitCore.run(JUnitCore) .java:157)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)at com .intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:182)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我不确定我能做些什么.关于变通方法的任何想法?

Chr*_*rry 5

解决方案适用于Robolectric 1.2,而非2. +

感谢Jan Berkel在此处回答:https: //groups.google.com/d/msg/robolectric/beW9XjT8E1A/pJQrRaybN30J

class MyJniClass {
 static {
        try {
            System.loadLibrary("libname");
        } catch (UnsatisfiedLinkError e) {
            // only ignore exception in non-android env
            if ("Dalvik".equals(System.getProperty("java.vm.name"))) throw e;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在测试员中:

public class MyTestRunner  extends RobolectricTestRunner {
   public MyTestRunner(Class testClass) throws InitializationError {
         // remove native calls + replace with shadows
        addClassOrPackageToInstrument("com.example.jni.MyJniClass");
   }

   protected void bindShadowClasses() {
         // bind shadow JNI classes
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是新的Robolectric 2. +解决方案? (4认同)