2016-02-08 7 views
6

В настоящее время я создаю библиотеку Android для использования в реале собственного проекта. Мне нужно выбросить карту в javascript, поэтому я использую класс WriteableMap для родного языка. К сожалению, класс загружает реактивную SO в статическом блоке, что приводит к UnsatisfiedLinkError во время модульных тестов. Я использую JUnit и Mockito для тестирования.UnsatisfiedLinkError при модульном тестировании WritableNativeMap

Мой код:

@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 для модульных тестов, но это статический, и я предпочел бы не должны заглушить статический метод.

Есть ли способ избавиться от этой ошибки при выполнении модульных тестов?

ответ

4

Я не думаю, что вы можете избежать издевательств методов Аргументов в модульном тесте (хотя я считаю, что вам не нужно это делать в контрольно-измерительном тесте).

В испытаниях на 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}" 
    ... 
} 

Версии, которые они используют c можно найти в файле gradle.properties.

Я не знаю, насколько стабильны эти тестовые конфигурации в долгосрочной перспективе, но эта конфигурация позволила мне работать с ReadableMap/Array и WritableMap/Array в модульных тестах.

Смежные вопросы