2010-09-24 11 views
5

Estoy escribiendo una prueba JUnit de Android y quiero copiar/restablecer un archivo de prueba (es un archivo de base de datos SQLite). Si estuviera dentro del aplicación, sé que podría simplemente colocar el archivo en el directorio de activos y usar getResources().getAssets().open(sourceFile)¿Cómo puedo transferir un dispositivo de prueba de base de datos al dispositivo desde mi aplicación de prueba de unidad?

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

¿Hay alguna manera fácil de copiar un archivo desde la PC de prueba, o debería simplemente guardar una copia nueva de un accesorio de prueba en el dispositivo y copiarlo en un archivo temporal?

Gracias!

Respuesta

3

Lo que he hecho para lograr esto (de una manera no muy elegante) es copiar el accesorio de prueba en mi dispositivo (o dispositivo emulado). Lo llamé "cleantestdatabase.db". Luego, en el código de prueba, lo copio en "testdatabase.db", para poder 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(); 
} 
6

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

getInstrumentation().getContext().getResources() 

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

getInstrumentation().getTargetContext().getResources() 

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

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

devuelve un InputStream. No hay forma de modificar el archivo. Eso se debe a que los activos se almacenan comprimidos dentro de la APK, y en realidad no se pueden escribir.

Si lo que quiere hacer es modificar la ruta a los archivos que utiliza la actividad que está probando, debe usar ActivityUnitTestCase y setActivityContext() con RenamingDelegatingContext. Esto le permite redirigir el acceso a archivos y bases de datos en un contexto a un nuevo directorio especificando un prefijo de directorio. Incluso puede usar el more complex constructor para ajustar el contexto objetivo para la mayoría de las operaciones, pero use el contexto de la aplicación de prueba para las operaciones de archivos, de modo que la actividad acceda a los archivos almacenados en la aplicación de prueba en lugar de a la aplicación principal. .

+0

Muchas gracias por la gran respuesta. Veo que todavía tengo mucho que aprender sobre las pruebas de Android. Te actualizaré cuando pueda implementar una de estas soluciones. –

+0

Cuando traté de ejecutar InputStream in = getResources(). GetAssets(). Open ("test.txt") en mi aplicación de prueba, y coloqué un archivo llamado "test.txt" en mi directorio de activos, recibí una excepción . –

+1

@glenviewjeff ¿En qué contexto llamabas a getResources()? ¿En un método de prueba o dentro de una actividad lanzada desde una prueba? ¿Estás seguro de que los 'Recursos' que estabas usando provienen de 'getContext()' de la Instrumentación y no de 'getTargetContext()'? –

Cuestiones relacionadas