2016-02-08 14 views
6

Şu anda bir tepki yerel projesinde kullanmak için bir Android kitaplığı oluşturuyorum. Javascript için bir harita yaymam gerekiyor, bu yüzden yerel native WriteableMap sınıfını kullanıyorum. Maalesef, sınıf, reaktif Projeni SO'ya statik bir blokta yükler, bu da ünite testleri sırasında bir UnsatisfiedLinkError'a yol açar. Test etmek için JUnit ve Mockito kullanıyorum.Üniteyi test ederken WritableNativeMap

Kodum:

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

    //fill map 

    sendEvent("onChange", params); 
} 

hatası:

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) 

Ben birim testler için WriteableMap stubbing hakkında bir yorum gördükten sonra Arguments.createMap() yöntemi kullanmaya başladı, ancak statik ve ben değil tercih ederim Statik bir yöntem saplamak zorunda.

Birim testlerini çalıştırırken bu hatayı ortadan kaldırmanın bir yolu var mı?

cevap

4

Bir birim sınamasında Argüman yöntemleriyle alay etmekten kaçınamayacağınızı sanmıyorum (bunun bir enstrümantasyon testinde yapmanız gerekmediğine inanıyorum). https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

İlginç bitleri: bunları alay PowerMockito kullanmak

Facebook'un kendi testlerde

Ayrıca

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

bu bu alay araçları içerecek şekilde build.gradle değiştirmenizi gerektiriyor unutmayın: 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}" 
    ... 
} 

Kullandıkları sürümler c Onların bir gradle.properties dosyasında bulundu.

Bu test yapılandırmalarının uzun vadede ne kadar kararlı olacağını bilmiyorum, ancak bu yapılandırma birim testlerinde ReadableMap/Array ve WritableMap/Array ile çalışmama izin verdi.