簡體   English   中英

Robolectric坦克在加載JNI庫的Application對象上。 我可以獲得解決方法嗎?

[英]Robolectric tanks on Application objects that load JNI libraries. Can I get a workaround?

我的Android應用程序的Application對象加載了一個JNI庫,而Robolectric似乎並不喜歡這樣。 當我去運行我的測試時,Robolectric出來了,我得到了這個堆棧跟蹤:

java.lang.UnsatisfiedLinkError:java.lang上的java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)的java.library.path中沒有cperryinc-jni,java.lang.Runtime.loadLibrary0(Runtime.java:823) .system.loadLibrary(System.java:1045)at com.cperryinc.application.MoolaApplication。(MoolaApplication.java:24)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class。 java:169)at com.xtremelabs.robolectric.internal.ClassNameResolver.safeClassForName(ClassNameResolver.java:36)at com.xtremelabs.robolectric.internal.ClassNameResolver.resolve(ClassNameResolver.java:15)at 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)位於org.junit.runner.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)的.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)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)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我不確定我能做些什么。 關於變通方法的任何想法?

解決方案適用於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;
        }
    }
}

然后在測試員中:

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
   }
}

使用重量級應用程序的應用程序的一個選項與Robolectric不兼容的是創建一個空的Application對象並將其用於您的Robolectric測試:

像這樣的東西:

public void EmptyApp extends Application { 
}

然后您的測試設置可能如下所示:

@RunWith(RobolectricTestRunner.class)
@Config(application = EmptyApplication.class, manifest = "src/main/AndroidManifest.xml", sdk = 23)   

由於您已引用清單,因此所有資源仍可在Context#getString(int id) ,依此類推。

正如@Jared指出的那樣,@ Christopher給出的解決方案對Robolectric 2或3不起作用。

我最終使用的解決方案是添加環境變量:

ROBOLECTRIC=TRUE

到我的測試的構建配置。 (運行 - >編輯配置,環境變量)。

然后在加載有問題的庫之前檢查該環境變量。 例如:

class MyClass {
    if(System.getenv("ROBOLECTRIC") == null) {
        System.loadLibrary("libname");
    }
}

顯然你將無法測試任何依賴於該庫的代碼,但至少可以進行一些測試!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM