2013-01-14 10 views
5

Sto usando InstrumentationTestCase per testare un componente della mia applicazione.InstrumentationTestCase Android getFilesDir() restituisce null

Il componente persiste i dati nella memoria interna e utilizza Context::fileList(); per recuperare i file persistenti.

Ho riscontrato il seguente problema: L'utilizzo di questo metodo nell'app (sul dispositivo) funziona perfettamente. Ma quando provo a (Android-) Unit-Test (anche sul dispositivo) con l'uso di InstrumentationTestCase ottengo uno NullPointerException all'interno del metodo fileList(). Ho scavato nella fonte Android e ho scoperto che getFilesDir()(see source here) restituisce null e causa questo errore.

Il codice per riprodurre è il seguente:

public class MyTestCase extends InstrumentationTestCase 
{ 
    public void testExample() throws Exception 
    { 
     assertNotNull(getInstrumentation().getContext().getFilesDir()); // Fails 
    } 
} 

Le mie domande sono: E 'questo comportamento destinato? Cosa posso fare per aggirare questo problema? Sto usando InstrumentationTestCase giusto o dovrei usare qualcosa di diverso?

Ho trovato this question ma non sono sicuro se questo copre lo stesso problema che ho.

+0

Hai provato a utilizzare getTargetContext() invece di getContext() – Blackbelt

+0

Beh, sì. 'getTargetContext()' funziona come previsto, ma voglio che i test siano eseguiti (più o meno) indipendentemente dall'app. Questa è la ragione per cui ho scelto 'InstrumentationTestCase'. – GeneSys

+0

Come dice il nome, InstrumentationTestCase è un test di strumentazione, utilizzando la seconda app di test per lo strumento dell'app principale per testare il componente Android, ad esempio l'attività è correttamente resa o l'interazione dell'utente viene gestita correttamente. Non ha molto senso eseguire l'app di test indipendentemente dall'app principale. – yorkw

risposta

10

Penso che tu abbia ragione nel tenere separati i dati del test dall'applicazione testata.

È possibile risolvere problema con Null creando files directory per Instrumentation app eseguendo i seguenti comandi

adb shell 
cd /data/data/<package_id_of_instrumentation_app> 
mkdir files 

Si può fare sopra solo su emulatore o dispositivo radicata.

Quindi il test della domanda non avrà esito negativo. L'ho fatto e anche file caricato chiamato tst.txt a files dir, tutti i test di seguito sono stati di successo:

assertNotNull(getInstrumentation().getContext().getFilesDir()); 
assertNotNull(getInstrumentation().getContext().openFileInput("tst.txt")); 
assertNotNull(getInstrumentation().getContext().openFileOutput("out.txt", Context.MODE_PRIVATE)); 

Ma penso modo più conveniente per fornire i dati di progetto di test è quello di utilizzare assets del progetto di test in cui si può semplicemente salvare alcuni file e aprirli:

assertNotNull(getInstrumentation().getContext().getAssets().open("asset.txt")); 

o se si desidera salvare alcuni risultati di test per il file è possibile utilizzare ExternalStorage:

File extStorage = Environment.getExternalStorageDirectory(); 
assertNotNull(extStorage); 
+1

+1 bello. La correzione della shell mi consentiva di mantenere la persistenza dei dati dell'unità di test basata su Realm.io. –

+1

Perché la directory dei file non è presente in primo luogo? – JohnyTex

Problemi correlati