2011-02-23 16 views
5

Estoy tratando de probar los métodos de inserción y recuperación para mi subclase SQLiteOpenHelper en una aplicación de Android. La subclase SQLLiteHelper existe en la aplicación bajo prueba y crea una base de datos en la carpeta de instalación. Sin embargo, la prueba de unidad existe en un InstrumentTestCase en la aplicación de prueba, y me gustaría crear una base de datos de prueba en la aplicación de prueba.no se puede abrir la base de datos en la aplicación de prueba de Android

Por desgracia, si trato de crear/abrir una base de datos en la aplicación de prueba, me sale el siguiente excepción:

android.database.sqlite.SQLiteException: unable to open database file 
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584) 
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638) 
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168) 
at com.kizoom.android.mybus.storage.MyStopsDatabase.getMyStops(MyStopsDatabase.java:63) 
at com.kizoom.mybus.test.MyStopsDatabaseTest.testGetMyStops(MyStopsDatabaseTest.java:24) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:191) 
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:181) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:425) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1520) 

The following information appears in LogCat. 

02-21 11:52:16.204: ERROR/Database(1454): sqlite3_open_v2("/data/data/com.kizoom.mybus.test/databases/MyStops", &handle, 6, NULL) failed 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): Couldn't open MyStops for writing (will try read-only): 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): android.database.sqlite.SQLiteException: unable to open database file 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584) 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638) 

¿Alguien sabe por qué esto sería un fracaso?

+1

El error sugiere que no está creando su base de datos, o posiblemente la está creando fuera de 'SQLiteOpenHelper.onCreate()' (ya que no se puede abrir) y por lo tanto cuando utiliza otros métodos de conveniencia 'SQLiteOpenHelper', desconocen su base de datos. Por favor, publique su código donde crea la base de datos, y su 'onCreate' para su' SQLiteOpenHelper 'subclasificado. – RivieraKid

+0

La respuesta correcta es esta: http://stackoverflow.com/a/8488722/1432640 – stillwaiting

Respuesta

4

que utilice la configuración siguiente() - Método en mi TestDatabaseHelper * -TestCases:

@Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     final SQLiteDatabase db = SQLiteDatabase.create(null); 
     Context context = new MockContext() { 
      @Override 
      public SQLiteDatabase openOrCreateDatabase(String file, int mode, SQLiteDatabase.CursorFactory factory) { 
       return db; 
      }; 
     }; 
     mHelper = new MyCustomSubclassOfDatabaseHelper(context); 
     mDb = mHelper.getWritableDatabase(); 
     wipeData(mDb); 
    } 
    public void wipeData(SQLiteDatabase db) { 
     db.execSQL("DELETE FROM " + TABLENAME + ";"); 
    } 

Es muy bueno porque la documentación dice acerca SQLiteDatabase.create():

Crear una memoria respaldada Base de datos SQLite Su contenido se destruirá cuando la base de datos esté cerrada.

Por lo tanto, su base de datos de prueba no se conserva y puede probar fácilmente sus métodos personalizados de inserción/actualización/consulta/eliminación.

Espero que esto ayude. Si queda alguna pregunta, no dude en preguntar.

Saludos, Christoph

+0

Hola @Chistoph ¿qué es el método wipedata y cómo puedo usar esto para probar el funcionamiento de la base de datos? Gracias – Tony

+0

Hola @Tony, me tomó un tiempo para encontrar el código de hace 4 años (la pregunta es en realidad 5 años). Actualicé el ejemplo de código para incluir wipeData, eche un vistazo. La idea es que ahora puede probar DatabaseHelper sin preocuparse de que haya datos en SQLiteDatabase de otros testruns. –

+0

Muchas gracias, lo comprobaré – Tony

30

En lugar de utilizar getInstrumentation().getContext() para el contexto durante la creación del ayudante db, me cambiaron a getInstrumentation().getTargetContext() y funciona.

+0

¡Gracias, funcionó! – David

+0

Hay una diferencia muy real entre Instrumentation # getContext() que devuelve el contexto de la aplicación de prueba e Instrumentation # getTargetContext() que devuelve el contexto de su aplicación real. Esto significa que usar Instrumentation # getTargetContext #() es arriesgado porque sus pruebas podrían modificar los archivos que realmente usa su aplicación. –

Cuestiones relacionadas