2012-02-12 30 views
17

He configurado un proyecto de prueba de Android que ejecuta pruebas junit. Utiliza dos proyectos de eclipse, "Aplicación" y "Prueba de aplicación", donde mis pruebas se encuentran en el proyecto "Prueba de aplicación". En una de mis pruebas necesito acceder a un archivo, esto funciona bien si pongo el archivo en la tarjeta SD y le señalo un objeto File. Sin embargo, me gustaría acceder al archivo como un recurso, pero parece que no funciona. Esto es lo que hice:Acceso a recursos en un proyecto de prueba de Android

  • guardó el archivo en ApplicationTest/res/raw/myfile.xml
  • tratando de hacerlo usando: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);

Pero eso me da esta excepción:

 
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 

Mi clase de prueba extiende AndroidTestCase, de ahí viene el contexto.

Actualización:

Así que el problema parece ser que durante la compilación se utilizan los recursos en el proyecto de prueba, pero en tiempo de ejecución se utilizan los recursos en el proyecto principal. Todavía no estoy seguro de cómo solucionar eso. Por lo tanto, actualmente solo funciona si pongo el mismo recurso en bruto tanto en el proyecto de prueba como en el proyecto principal, que por supuesto es bastante estúpido.

+0

no está claro lo que está tratando de hacer aquí. O puede ser solo yo. ¿Puedes elaborar lo que estás tratando de hacer aquí? La configuración es clara, solo da un ejemplo de lo que esperas para un resultado PASS y un resultado FAIL. – Siddharth

+0

@ Siddharth No estoy seguro de qué debería elaborar, quiero decir, si se encontrara el recurso, mi prueba pasaría (ya que funciona bien si tengo acceso al archivo directamente desde la tarjeta SD). Supongo que podría haber olvidado algo sobre cómo usar los archivos de recursos en Android, o cómo acceder a ellos desde las clases de prueba de la unidad. – Zitrax

+0

¿Ayudaría si el proyecto de prueba de Android es un proyecto secundario? O un proyecto dependiente? – Siddharth

Respuesta

23

Sugeriría extender ActivityTestCase en lugar de AndroidTestCase. Puede acceder a los recursos del proyecto de prueba a través del

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

maniquí ejemplo de caso de prueba:

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); 
    }  
} 

Y luego, en los métodos de ensayo utilizan getInstrumentation().getTargetContext() donde quiera que utilizó getContext() en su extensión AndroidTestCase.

+0

Gracias esto funcionó. Sin embargo, tuve un problema con la creación de la base de datos, pero encontré la solución aquí: http://stackoverflow.com/a/8488722/11722 – Zitrax

+0

Me alegra oír eso. :) – plesatejvlk

+1

¡Muchas gracias por la sugerencia! PD InstrumentationTestCase también parece funcionar. – Y2i

2

que deriva el caso de prueba de la siguiente manera:

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

Y el test_image.bmp archivo se guarda en el directorio de activos, lo cual es razonable si tiene la intención de utilizar el activo por algún trabajo relacionado con las pruebas - y no es parte de los recursos de ui. La técnica se utiliza en otro contexto aquí: https://stackoverflow.com/a/4570206/1577626

+1

Tuve que cambiar 'getContext()' a 'getTargetContext()' – joslinm

+0

Aún recibo un error: ** android.content.res.Resources $ NotFoundException: String resource ID # 0x7f06000e ** –

0

Desde Android Gradle Plugin versión 1.1 no tiene que usar Instrumentation para cargar el recurso de archivo.

Escribí here cómo hacerlo con POJO unit test caso.

0

Con herramientas de construcción 3.0.0 se puede utilizar 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") 
     } 
    } 
} 
Cuestiones relacionadas