我无法开始使用 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
我不相信有任何方法可以在 Robolectric 上运行 Couchbase Lite Android。
问题是,为了本质上做任何事情,Couchbase Lite 必须加载本机代码引擎 LiteCore。 LiteCore 使用 C++ 编写,包含在 Couchbase Lite Android aar 中。当安装 aar 时,Android 系统会解压原生库并将其放在可以加载的位置。
Robolectric 不这样做。因此,无法加载库并且任何 JNI 调用都将失败。