2010-09-24 12 views
5

sto scrivendo un test JUnit Android e si desidera copiare/ripristinare un file di dispositivo di prova (si tratta di un file di database SQLite.) Se fossi nel principale applicazione, so che potrei semplicemente inserire il file nella directory assets e utilizzare getResources().getAssets().open(sourceFile)Come posso trasferire un dispositivo di prova del database per dispositivo dalla mia unità di applicazione di test

Tuttavia, questa API sembra non essere disponibile dalla classe ActivityInstrumentationTestCase2.

C'è un modo semplice per copiare un file dal PC nel corso di test, o devo solo tenere una nuova copia di un dispositivo di prova sul dispositivo e copiarlo su un file temporaneo?

Grazie!

risposta

3

Quello che ho fatto per realizzare questo (in un modo non molto elegante) è copiare l'apparecchio di prova sul mio dispositivo (o dispositivo emulato). L'ho chiamato "cleantestdatabase.db." Quindi nel codice di test, lo copio in "testdatabase.db", in modo che possa essere modificato con i miei test ma resettato a uno stato noto. Ecco il codice:

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

Le risorse nell'applicazione di test e nell'applicazione principale sono accessibili separatamente in un test case di strumentazione. Se si desidera accedere alle risorse che si trovano nella res/cartella di crudo o attivi del progetto di test in sé, è possibile utilizzare

getInstrumentation().getContext().getResources() 

per accedere alle risorse nell'applicazione in fase di test (l'applicazione "target"), utilizzare

getInstrumentation().getTargetContext().getResources() 

Nota, tuttavia, che non è possibile modificare i file nella cartella delle risorse;

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

restituisce un InputStream. Non c'è modo di modificare il file. Questo perché le risorse sono archiviate compresse all'interno dell'APK e non sono affatto modificabili.

Se ciò che si desidera è modificare il percorso dei file utilizzati dall'attività che si sta testando, è necessario utilizzare ActivityUnitTestCase e setActivityContext() con un RenamingDelegatingContext. Ciò consente di reindirizzare l'accesso a file e database in un contesto a una nuova directory specificando un prefisso di directory. È anche possibile utilizzare il more complex constructor per avvolgere il contesto di destinazione per la maggior parte delle operazioni, ma utilizzare contesto dell'applicazione di prova per le operazioni sui file, quindi l'attività sarà accedere ai file memorizzati nella applicazione di test piuttosto che l'applicazione principale, ma ancora usare altre risorse nell'applicazione primario .

+0

Grazie mille per l'ottima risposta. Vedo che ho ancora molto da imparare sui test di Android. Ti aggiornerò quando sarò in grado di implementare una di queste soluzioni. –

+0

Quando ho provato ad eseguire l'InputStream in = getResources(). GetAssets(). Aperto ("test.txt") nella mia applicazione di test, e messo un file denominato "test.txt" nella mia directory attivi, ho ottenuto un'eccezione . –

+1

@glenviewjeff In che contesto stavi chiamando getResources()? In un metodo di prova o all'interno di un'attività lanciata da un test? Sei sicuro che il 'Risorse' che stavi usando provenga da' getContext() 'e non da' getTargetContext() '? –

Problemi correlati