2012-02-12 18 views
17

Ho installato un progetto di prova Android che esegue i test di junit. Sta usando due progetti Eclipse "Application" e "ApplicationTest" dove i miei test sono nel progetto "ApplicationTest". In uno dei miei test ho bisogno di accedere a un file, questo funziona bene se metto il file sulla sdcard e punto un oggetto File ad esso. Tuttavia vorrei accedere al file come una risorsa, ma non sembra funzionare. Questo è quello che ho fatto:Accesso alle risorse in un progetto di prova Android

  • salvato il file in ApplicationTest/res/raw/myfile.xml
  • cercando di farlo utilizzando: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);

Ma che mi dà questa eccezione:

 
android.content.res.Resources$NotFoundException: File Hello World, HelloAndroidActivity! from drawable resource ID #0x7f040000 
at android.content.res.Resources.openRawResource(Resources.java:823) 
at android.content.res.Resources.openRawResource(Resources.java:799) 
at com.quizzer.test.QuestionHandlerTests.testImportQuestions(Tests.java:182) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448) 
Caused by: java.io.FileNotFoundException: Hello World, HelloAndroidActivity! 
at android.content.res.AssetManager.openNonAssetNative(Native Method) 
at android.content.res.AssetManager.openNonAsset(AssetManager.java:406) 
at android.content.res.Resources.openRawResource(Resources.java:820) 
... 14 more 

mia classe di test estende AndroidTestCase, quindi è da lì che viene il contesto.

Aggiornamento:

Così il problema sembra essere il fatto che durante la compilazione vengono utilizzate le risorse nel progetto di test, ma in fase di esecuzione vengono utilizzate le risorse nel progetto principale. Non sono ancora sicuro di come sistemarlo. Quindi attualmente funziona solo se metto la stessa risorsa grezza sia nel progetto di test che nel progetto principale che, naturalmente, è abbastanza stupido.

+0

La sua non è chiaro che cosa si sta cercando di fare qui. O potrebbe essere solo io. Puoi elaborare quello che stai cercando di fare qui. La configurazione è chiara, basta dare un esempio di ciò che ti aspetti da un risultato PASS e da un risultato FALLITO. – Siddharth

+0

@Siddharth Non sono sicuro di cosa dovrei elaborare, voglio dire se la risorsa è stata trovata, il mio test sarebbe passato (come funziona se accedo al file direttamente dalla sdcard). Credo che mi sarebbe sfuggito qualcosa su come utilizzare i file di risorse in Android, o come accedervi dalle classi di test delle unità. – Zitrax

+0

Quindi sarà d'aiuto se il progetto di test per Android è un sottoprogetto? O un progetto dipendente? – Siddharth

risposta

23

Suggerirei di estendere ActivityTestCase anziché AndroidTestCase. È possibile accedere alle risorse del progetto di prova tramite

getInstrumentation().getContext().getResources().openRawResource(R.raw.your_res).

Dummy banco di prova esempio:

public class Test extends ActivityTestCase { 

    public void testFoo() { 

     // .. test project environment 
     Context testContext = getInstrumentation().getContext(); 
     Resources testRes = testContext.getResources(); 
     InputStream ts = testRes.openRawResource(R.raw.your_res); 

     assertNotNull(testRes); 
    }  
} 

E poi a metodi di prova utilizzano getInstrumentation().getTargetContext() ovunque si è utilizzato getContext() nel vostro AndroidTestCase estensione.

+0

Grazie a questo ha funzionato. Ho avuto un problema con la creazione del database, ma ho trovato la soluzione qui: http://stackoverflow.com/a/8488722/11722 – Zitrax

+0

Felice di sentirlo. :) – plesatejvlk

+1

Grazie mille per il suggerimento! Post scriptum Anche InstrumentationTestCase sembra funzionare. – Y2i

2

ho derivato il banco di prova come segue:

class MyTest extends InstrumentationTestCase { 
    void setUp() { 
     InputStream is = getInstrumentation().getContext().getAssets() 
      .open("test_image.bmp"); 
     ... 
    } 
} 

e il file test_image.bmp viene salvato nella directory degli asset, che è ragionevole se si intende utilizzare il bene per un certo lavoro relativo collaudo - e la sua non parte delle risorse ui. La tecnica viene utilizzata in un altro contesto qui: https://stackoverflow.com/a/4570206/1577626

+1

Ho dovuto cambiare 'getContext()' a 'getTargetContext()' – joslinm

+0

Ricevo ancora un errore: ** android.content.res.Resources $ NotFoundException: ID risorsa stringa # 0x7f06000e ** –

0

Dal Android Gradle Plugin versione 1.1 non è necessario utilizzare Instrumentation per caricare la risorsa file.

Ho scritto here come farlo con il caso POJO unit test.

0

Con strumenti di compilazione 3.0.0 è possibile utilizzare ActivityTestRule

@RunWith(AndroidJUnit4::class) 
@SmallTest 
class MainActivityTest { 
    @Rule 
    @JvmField 
    var mainActivityRule = ActivityTestRule(MainActivity::class.java) 

    private val baseUrl: String 
     get() { 
      return mainActivityRule.activity.getString(R.string.base_url) 
     } 

    @Test 
    fun launchingWithMovieIntent() { 
      assert.that(baseUrl, equalTo("someValue") 
     } 
    } 
} 
Problemi correlati