不满意链接错误 当单元测试 WritableNativeMap.



我目前正在创建一个用于 react 原生项目的 Android 库。我需要发出一个映射到javascript,所以我正在使用react native的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)

在看到有关为单元测试存根 WriteableMap 的评论后,我开始使用 Arguments.createMap() 方法,但它是静态的,我宁愿不必存根静态方法。

运行单元测试时有什么方法可以消除此错误吗?

我认为您无法避免在单元测试中嘲笑 Arguments 方法(尽管我相信您在插桩测试中不需要这样做)。

在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/Array 和 WritableMap/Array。

你也可以

使用JavaOnlyMap,它实现了WritableMapReadableMap

所以无论你在哪里需要使用Arguments.createMap(),只需更换为new JavaOnlyMap()

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

相关内容

  • 没有找到相关文章

最新更新