Robolectric 和 Couchbase 的 java.lang.UnsatisfiedLinkError

问题描述 投票:0回答:1

我无法开始使用 Robolectric 单元测试,因为 couchbase db 出现以下错误。

java.lang.UnsatisfiedLinkError: com.couchbase.lite.internal.database.sqlite.SQLiteConnection.nativeOpen(Ljava/lang/String;ILjava/lang/String;ZZ)J

这个错误是在我的 CouchbaseWrapper 类语法中抛出的,

    // Get existing db with that name
    // or create a new one if it doesn't exist.
    database = manager.getDatabase(dbname);

如果我这样做

database = manager.getDatabase(dbname, true);
,那么此步骤“通过”,但其他步骤返回 NPE。

这是我的测试用例:

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class OnBoardingPageOneTest {

private OnboardingActivity onboardingActivity;

@Before
public void setUp() {
    onboardingActivity = Robolectric.setupActivity(OnboardingActivity.class);
}

@Test
public void verifyElementsArePresent() {
    assertThat(onboardingActivity.findViewById(R.id.text_container), is(not(null)));
    assertThat(onboardingActivity.findViewById(R.id.intro_video_view), is(not(null)));
    assertThat(onboardingActivity.findViewById(R.id.play_button), is(not(null)));
    assertThat(onboardingActivity.findViewById(R.id.loading_progress), is(not(null)));
    }
}

日志

Library not found: /native/osx/x86_64/libsqlcipher.dylib
Library not found: /native/osx/x86_64/libsqlite3.dylib
Library not found: /native/osx/x86_64/libsqlcipher.dylib
Library not found: /native/osx/x86_64/libsqlite3.dylib

java.lang.UnsatisfiedLinkError: com.couchbase.lite.internal.database.sqlite.SQLiteConnection.nativeOpen(Ljava/lang/String;ILjava/lang/String;ZZ)J

at com.couchbase.lite.internal.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at com.couchbase.lite.internal.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
at com.couchbase.lite.internal.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:178)
at com.couchbase.lite.internal.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:461)
at
unit-testing android-sqlite robolectric android-testing couchbase-lite
1个回答
0
投票

我不相信有任何方法可以在 Robolectric 上运行 Couchbase Lite Android。

问题是,为了本质上做任何事情,Couchbase Lite 必须加载本机代码引擎 LiteCore。 LiteCore 使用 C++ 编写,包含在 Couchbase Lite Android aar 中。当安装 aar 时,Android 系统会解压原生库并将其放在可以加载的位置。

Robolectric 不这样做。因此,无法加载库并且任何 JNI 调用都将失败。

© www.soinside.com 2019 - 2024. All rights reserved.