2016-02-08 15 views
6

Attualmente sto creando una libreria Android da utilizzare in un progetto nativo reattivo. Devo emettere una mappa su javascript, quindi sto usando la classe WriteableMap di native del react. Sfortunatamente, la classe carica il reactnativejni SO in un blocco statico, che porta a un UnsatisfiedLinkError durante i test unitari. Sto usando JUnit e Mockito per testare.UnsatisfiedLinkError durante il test dell'unità. WritableNativeMap

Il mio codice:

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

    //fill map 

    sendEvent("onChange", params); 
} 

L'errore:

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) 

ho iniziato ad usare il metodo Arguments.createMap() dopo aver visto un commento su spegnendo WriteableMap per i test unitari, ma è statico e preferirei non Devo stub un metodo statico.

C'è un modo per eliminare questo errore durante l'esecuzione dei test delle unità?

risposta

4

Non penso che si possa evitare di deridere i metodi degli Argomenti in un test di unità (anche se credo che non sia necessario farlo in un test di strumentazione).

In proprie prove di Facebook, usano PowerMockito per derisione: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

bit interessanti:

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

anche notare che questo richiede di modificare la build.gradle per includere questi strumenti di scherno: 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}" 
    ... 
} 

Le versioni che usano c uno si trova nel loro file gradle.properties.

Non so quanto siano stabili queste configurazioni di test nel lungo periodo, ma questa configurazione mi ha permesso di lavorare con ReadableMap/Array e WritableMap/Array nei test unitari.

Problemi correlati