2016-02-08 45 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) 

私はユニットテストのためのWriteableMapをスタブについてのコメントを見た後Arguments.createMap()方法を使用し始め、それが静的だと私はないことを好むだろう静的メソッドをスタブする必要があります。

ユニットテストを実行中にこのエラーを取り除く方法はありますか?

答えて

4

ユニットテストでArgumentsメソッドを嘲笑するのを避けることはできませんが(私はあなたがインストルメンテーションテストでそうする必要はないと考えていますが) https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

興味深いビット::彼らはそれらを模擬するためにPowerMockitoを使用

Facebookの自身のテストでは

、また

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を使用できます。