2012-04-30 10 views
5

Próbuję napisać przypadek testowy Androida na bloku kodu w aplikacji na Androida. Blok kodu będzie współdziałać z bazą danych (funkcje biblioteki sqlcipher), a konkretnie funkcja dbopen(). Podczas uruchamiania aplikacji działa poprawnie. Kiedy próbowaliśmy wykonać test case dla tego bloku kodu (który wymaga interakcji z bazą danych). Występuje następujący błąd: java.lang.UnsatisfiedLinkError: dbopenjava.lang.UnsatisfiedLinkError: dbopen

Czy ktoś może zajrzeć do tego i zasugerować.

Nie można zakwalifikować przypadku testowego do wywołania funkcji, która wywołuje funkcje biblioteki sqlcipher. Wszelkie wymagane uprawnienia. Czy istnieje jakaś specjalna procedura dla tego typu przypadków testowych?

kompletny log błędu:

  04-30 12:08:33.997: I/TestRunner(2169): started: teststateMachine(com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest) 
      04-30 12:08:34.147: W/dalvikvm(2169): No implementation found for native Linfo/guardianproject/database/sqlcipher/SQLiteDatabase;.dbopen (Ljava/lang/String;I)V 
      04-30 12:08:34.164: I/TestRunner(2169): failed: teststateMachine(com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest) 
      04-30 12:08:34.164: I/TestRunner(2169): ----- begin exception ----- 
      04-30 12:08:34.184: I/TestRunner(2169): java.lang.UnsatisfiedLinkError: dbopen 
      04-30 12:08:34.184: I/TestRunner(2169):  at info.guardianproject.database.sqlcipher.SQLiteDatabase.dbopen(Native Method) 
      04-30 12:08:34.184: I/TestRunner(2169):  at info.guardianproject.database.sqlcipher.SQLiteDatabase.<init>(SQLiteDatabase.java:1870) 
      04-30 12:08:34.184: I/TestRunner(2169):  at info.guardianproject.database.sqlcipher.SQLiteDatabase.openDatabase(SQLiteDatabase.java:863) 
      04-30 12:08:34.184: I/TestRunner(2169):  at info.guardianproject.database.sqlcipher.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:897) 
      04-30 12:08:34.184: I/TestRunner(2169):  at info.guardianproject.database.sqlcipher.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107) 
      04-30 12:08:34.184: I/TestRunner(2169):  at com.americanlogistics.mdd.rhapsody.database.SendQueueDBAdapter.open(SendQueueDBAdapter.java:45) 
      04-30 12:08:34.184: I/TestRunner(2169):  at com.americanlogistics.mdd.rhapsody.database.SendQueueDBAdapter.databaseHelperInstance(SendQueueDBAdapter.java:38) 
      04-30 12:08:34.184: I/TestRunner(2169):  at com.americanlogistics.mdd.rhapsody.common.ApplicationController.startDatabase(ApplicationController.java:530) 
      04-30 12:08:34.184: I/TestRunner(2169):  at com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest.teststateMachine(SigninViewsateMachineTest.java:61) 
      04-30 12:08:34.184: I/TestRunner(2169):  at java.lang.reflect.Method.invokeNative(Native Method) 
      04-30 12:08:34.184: I/TestRunner(2169):  at java.lang.reflect.Method.invoke(Method.java:507) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestCase.runTest(TestCase.java:154) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestCase.runBare(TestCase.java:127) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestResult$1.protect(TestResult.java:106) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestResult.runProtected(TestResult.java:124) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestResult.run(TestResult.java:109) 
      04-30 12:08:34.184: I/TestRunner(2169):  at junit.framework.TestCase.run(TestCase.java:118) 
      04-30 12:08:34.184: I/TestRunner(2169):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
      04-30 12:08:34.184: I/TestRunner(2169):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
      04-30 12:08:34.184: I/TestRunner(2169):  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
      04-30 12:08:34.184: I/TestRunner(2169):  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448) 
      04-30 12:08:34.184: I/TestRunner(2169): ----- end exception ----- 

Kod:

Poniższy wiersz w przypadku testowanego pośrednio wywołanie funkcji biblioteki sqlcipher.

ApplicationController.getInstance(). StartDatabase (this.getContext(). GetApplicationContext());

+0

może próbujesz uzyskać czytelny/zapisywalny z już czytelnej/zapisywalny kopii db. –

+3

Znalazłeś rozwiązanie? Sprawdziłeś poniższą odpowiedź jako "rozwiązuje problem", ale tak naprawdę nie wiadomo, co zrobić. – kmalmur

Odpowiedz

1
No implementation found for native Linfo/guardianproject/database/sqlcipher/SQLiteDatabase;.dbopen (Ljava/lang/String;I)V 

Wygląda na to, że kod jest niezgodny z uruchomioną wersją. Upewnij się, że są one zgodne.

0

http://www.coderanch.com/t/79145/Websphere/Native-lib-already-loaded-another

Ten „unsatisfy ogniwo” Błąd może wynikać z faktu, że klasa został załadowany, ale złym classloader w hierarchii classloaders uruchomieniowych.

Domyślam się, że pakiet Sqllite istnieje w ścieżce Classpath, ale w scenariuszu z uruchomieniem testów niewłaściwa instancja programu ładującego załadowała pakiety DB.

14

Napotkałem ten sam błąd podczas interakcji SQLCipher na Androida. Rozwiązaniem dla mnie było zadzwonić pod numer

SQLiteDatabase.loadLibs(Context context) 

przed pracą z bazą danych, zgodnie z zaleceniami. Dobre miejsce do połączenia to klasa pochodna aplikacji.

Please see the instructions here

+2

dlaczego ta opcja nie jest oznaczona jako poprawna? –

+0

Tak, używamy tego samego, ale mimo to otrzymujemy java.lang.UnsatisfiedLinkError: no sqlcipher in java.library.path. Uwaga: ten błąd dotyczy tylko przypadków testowych urządzenia Robolectric. – sandeepmaaram

Powiązane problemy