UnsatisfiedLinkError当单元测试WritableNativeMap

问题描述 投票:7回答:2

我目前正在创建一个本地反应项目使用Android库。我需要发出地图的JavaScript,所以我用母语反应的WriteableMap类。不幸的是,类加载reactnativejni SO在静态块,其在单元测试导致一个UnsatisfiedLinkError。我使用JUnit和对的Mockito测试。

我的代码:

@Override
public void onSomething() {
    WritableMap params = Arguments.createMap();

    //fill map

    sendEvent("onChange", params);
}

错误:

java.lang.UnsatisfiedLinkError: no reactnativejni in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
  at java.lang.Runtime.loadLibrary0(Runtime.java:870)
  at java.lang.System.loadLibrary(System.java:1119)
  at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:172)
  at com.facebook.react.bridge.NativeMap.<clinit>(NativeMap.java:23)
  at com.facebook.react.bridge.Arguments.createMap(Arguments.java:29)
  at me.MyClass.onSomething(myClass.java:23)

我开始使用Arguments.createMap()方法看关于斯塔宾单元测试WriteableMap评论之后,但它是静态的,我宁愿没有存根的静态方法。

是否有某种方式运行单元测试时,摆脱这种错误的?

android junit mockito react-native unsatisfiedlinkerror
2个回答
6
投票

我不认为你能避免嘲弄在单元测试的参数的方法(虽然我相信你并不需要在仪器测试这样做)。

在Facebook的自己的测试,他们使用PowerMockito嘲笑他们:https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

有趣的位:

PowerMockito.mockStatic(Arguments.class);
PowerMockito.when(Arguments.createArray()).thenAnswer(new Answer<Object>() {
  @Override
  public Object answer(InvocationOnMock invocation) throws Throwable {
    return new JavaOnlyArray();
  }
});
PowerMockito.when(Arguments.createMap()).thenAnswer(new Answer<Object>() {
  @Override
  public Object answer(InvocationOnMock invocation) throws Throwable {
    return new JavaOnlyMap();
  }
});

另外请注意,这需要你修改build.gradle包括这些嘲讽的工具:https://github.com/facebook/react-native/blob/master/ReactAndroid/build.gradle#L266

dependencies {
  ...
  testCompile "org.powermock:powermock-api-mockito:${POWERMOCK_VERSION}"
  testCompile "org.powermock:powermock-module-junit4-rule:${POWERMOCK_VERSION}"
  testCompile "org.powermock:powermock-classloading-xstream:${POWERMOCK_VERSION}"
  testCompile "org.mockito:mockito-core:${MOCKITO_CORE_VERSION}"
  testCompile "org.easytesting:fest-assert-core:${FEST_ASSERT_CORE_VERSION}"
  testCompile "org.robolectric:robolectric:${ROBOLECTRIC_VERSION}"
  ...
}

他们使用的版本,可以在其gradle.properties文件中找到。

我不知道这些测试配置将如何稳定是从长远来看,但是这种配置已经让我在单元测试ReadableMap /阵列和WritableMap /阵列工作。


0
投票

您还可以使用JavaOnlyMap,它同时实现了WritableMapReadableMap

因此,无论你需要使用Arguments.createMap(),只是new JavaOnlyMap()取代

参考:https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.java

© www.soinside.com 2019 - 2024. All rights reserved.