studio proyecto programacion móviles libros gratis estructura español desarrollo desarrollar curso con carpetas aprende aplicaciones android eclipse unit-testing

programacion - Acceso a recursos en un proyecto de prueba de Android



manual programacion android español pdf (4)

Con las herramientas de compilación 3.0.0 puedes usar 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") } } }

He configurado un proyecto de prueba de Android que ejecuta pruebas de Junit. Está utilizando dos proyectos de eclipse "Aplicación" y "Prueba de aplicación" donde mis pruebas están 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 apunto un objeto File a él. Sin embargo, me gustaría acceder al archivo como un recurso, pero eso no parece funcionar. Esto es lo que hice:

  • Guardó el archivo en ApplicationTest/res/raw/myfile.xml
  • Intentando obtenerlo utilizando: 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 modo que de ahí proviene el contexto.

Actualizar:

Entonces, el problema parece ser que durante la compilación se utilizan los recursos del proyecto de prueba, pero en el tiempo de ejecución se utilizan los recursos del proyecto principal. Todavía no estoy seguro de cómo arreglar eso. Así que 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.


Derivé 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 archivo test_image.bmp se guarda en el directorio de activos, lo cual es razonable si pretende utilizar el activo para algunos trabajos relacionados con las pruebas, y no es parte de los recursos de la interfaz de usuario. La técnica se utiliza en otro contexto aquí: https://.com/a/4570206/1577626


Desde la versión 1.1 de Android Gradle Plugin , no tiene que usar Instrumentation para cargar recursos de archivos.

Escribí here cómo hacerlo con el caso de prueba de la unidad POJO.


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

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

Ejemplo de caso de prueba ficticia:

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 prueba, use getInstrumentation().getTargetContext() dondequiera que haya usado getContext() en su extensión AndroidTestCase .