¿Cómo puedo transferir un dispositivo de prueba de base de datos al dispositivo desde mi aplicación de prueba de unidad

Estoy escribiendo una prueba JUnit para Android y quiero copiar / restablecer un archivo de prueba (es un archivo de base de datos SQLite). Si estuviera dentro de la aplicación principal, sé que podría colocar el archivo en el directorio de activos y usar getResources().getAssets().open(sourceFile)

Sin embargo, esta API parece no estar disponible de la clase ActivityInstrumentationTestCase2 .

¿Hay una manera fácil de copiar un archivo desde la PC de prueba, o debo guardar una copia fresca de un dispositivo de prueba en el dispositivo y copiarlo en un archivo temporal?

¡Gracias!

Los recursos de su aplicación de prueba y su aplicación principal se pueden acceder por separado en un caso de prueba de instrumentación. Si desea acceder a recursos que están en la carpeta res / raw o activos del proyecto de prueba en sí, puede utilizar

 getInstrumentation().getContext().getResources() 

Para acceder a los recursos de la aplicación que se está probando (la aplicación "destino"), utilice

 getInstrumentation().getTargetContext().getResources() 

Tenga en cuenta, sin embargo, que nunca puede modificar archivos en la carpeta de activos;

 getResources().getAssets().open(sourceFile) 

Devuelve un InputStream. No hay manera de modificar el archivo. Esto se debe a que los recursos se almacenan comprimidos dentro del APK, y no son realmente escritura en absoluto.

Si lo que desea hacer es modificar la ruta de acceso a los archivos de la actividad que está probando utiliza, debe utilizar ActivityUnitTestCase y setActivityContext () con un RenamingDelegatingContext . Esto le permite redireccionar el acceso a archivos y bases de datos en un contexto a un nuevo directorio especificando un prefijo de directorio. Incluso puede utilizar el constructor más complejo para ajustar el contexto de destino de la mayoría de las operaciones, pero usar el contexto de la aplicación de prueba para las operaciones de archivos, por lo que la actividad accederá a los archivos almacenados en la aplicación de prueba en lugar de la aplicación primaria. Aplicación primaria.

Lo que he hecho para lograr esto (de una manera no muy elegante) es copiar el dispositivo de prueba en mi dispositivo (o dispositivo emulado). Lo llamé "cleantestdatabase.db". A continuación, en el código de prueba, lo copio en "testdatabase.db" para que pueda modificarlo con mis pruebas, pero restablecerlo a un estado conocido. Aquí está el código:

 copyFile("cleantestdatabase.db", "testdatabase.db"); private void copyFile(String source, String dest) throws IOException{ String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + getActivity().getString(R.string.default_dir); File newDir = new File(rootPath); boolean result = newDir.mkdir(); if(result == false){ Log.e("Error", "result false"); } InputStream in = new FileInputStream(rootPath + source); File outFile = new File(rootPath + dest); if(outFile.exists()) { outFile.delete(); } outFile.createNewFile(); OutputStream out = new FileOutputStream(outFile); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } 
  • Cómo probar métodos de unidad que interactúan con clases de sistema (o Android)
  • Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos
  • Android Testing: ¿Puedo enviar sms al número de emulador del método de prueba?
  • Preguntas sobre la prueba de unidad Android con gradle o estudio de android
  • No se puede burlar la clase final de Kotlin usando Mockito 2
  • ¿Por qué realizar pruebas en un proyecto separado, en lugar de carpeta?
  • Prueba Unitaria de Retrofit 2 api call con Mockito
  • ¿Cómo compartir recursos entre la prueba de unidad y la prueba de instrumentación en android?
  • Prueba de unidad en Android Studio: error "no escarnecido"
  • Mock Retrofit Observable <T> respuesta en las pruebas de la unidad Android
  • Cómo burlar un objeto inyectado que no se declara en el módulo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.