2016-02-08 20 views
6

Tôi hiện đang tạo thư viện Android để sử dụng trong dự án gốc có phản ứng. Tôi cần phát ra một bản đồ cho javascript, vì vậy tôi đang sử dụng lớp WriteableMap của bản địa phản ứng. Thật không may, lớp nạp SO phản ứng trong một khối tĩnh, dẫn đến một UnsatisfiedLinkError trong các bài kiểm tra đơn vị. Tôi đang sử dụng JUnit và Mockito để kiểm tra.UnsatisfiedLinkError khi kiểm tra đơn vị WritableNativeMap

Mã của tôi:

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

    //fill map 

    sendEvent("onChange", params); 
} 

Lỗi:

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) 

tôi bắt đầu sử dụng phương pháp Arguments.createMap() sau khi nhìn thấy một nhận xét về stubbing WriteableMap cho unit tests, nhưng nó tĩnh và tôi muốn không phải tạo một phương thức tĩnh.

Có cách nào để loại bỏ lỗi này khi chạy thử nghiệm đơn vị không?

Trả lời

4

Tôi không nghĩ bạn có thể tránh chế nhạo các phương thức Đối số trong thử nghiệm đơn vị (mặc dù tôi tin rằng bạn không cần phải làm như vậy trong thử nghiệm thiết bị đo).

Trong các thử nghiệm riêng của Facebook, họ sử dụng PowerMockito để chế nhạo họ: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java#L67

bit Thú vị:

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

Cũng lưu ý rằng điều này đòi hỏi bạn phải thay đổi build.gradle bạn để bao gồm những công cụ này chế giễu: 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}" 
    ... 
} 

Phiên bản họ sử dụng c được tìm thấy trong tệp gradle.properties của họ.

Tôi không biết cấu hình thử nghiệm sẽ ổn định như thế nào trong thời gian dài, nhưng cấu hình này đã cho phép tôi làm việc với ReadableMap/Array và WritableMap/Array trong các bài kiểm tra đơn vị.