2016-02-08 3 views
6

Je suis en train de créer une bibliothèque Android à utiliser dans un projet natif. J'ai besoin d'émettre une carte en javascript, donc j'utilise la classe WriteableMap de react native. Malheureusement, la classe charge le SO de reactnativejni dans un bloc statique, ce qui conduit à une UnsuppiedLinkError lors des tests unitaires. J'utilise JUnit et Mockito pour tester.UnsatisfiedLinkError lors du test unitaire WritableNativeMap

Mon code:

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

    //fill map 

    sendEvent("onChange", params); 
} 

L'erreur:

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) 

je commencé à utiliser la méthode Arguments.createMap() après avoir vu un commentaire à propos stubbing WriteableMap pour les tests unitaires, mais il est statique et je préférerais ne pas avoir à bout d'une méthode statique.

Y a-t-il un moyen de se débarrasser de cette erreur lors des tests unitaires?

Répondre

4

Je ne pense pas que vous puissiez éviter de railler les méthodes Arguments dans un test unitaire (bien que je ne pense pas que vous ayez besoin de le faire dans un test d'instrumentation).

Dans propres tests de Facebook, ils utilisent PowerMockito pour les railler: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

morceaux intéressants:

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(); 
    } 
}); 

Notez également que cela vous oblige à modifier votre build.gradle pour inclure ces outils moqueurs: 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}" 
    ... 
} 

Les versions qu'ils utilisent c un être trouvé dans leur fichier gradle.properties. Je ne sais pas à quel point ces configurations de test seront stables à long terme, mais cette configuration m'a permis de travailler avec ReadableMap/Array et WritableMap/Array dans des tests unitaires.