write unitest unit test studio run create and android unit-testing

android - unitest - Accediendo al contexto de la aplicación desde TestSuite en Setup() antes de llamar a getActivity()



unitest android (4)

Tengo una Activity que extrae un objeto de una clase extendida de aplicación (contexto de aplicación) desde el método OnCreate() .

Cuando la unidad prueba esta actividad, el objeto necesario no está allí porque se rellena desde una actividad anterior y se almacena en el contexto de aplicación mencionado anteriormente.

No hace falta decir que cuando llamo a getActivity() desde mi caso de prueba extendido ActivityInstrumentationTestCase2 obtengo una excepción de puntero nulo.

¿Cómo puedo completar el contexto antes de comenzar una actividad y tenerlo disponible para esa Activity ?

Actualizado: Después de un poco de excavación encontré: this.getInstrumentation().getTargetContext() y luego lo convertí al tipo de mi clase extendida de Application . Pero obtengo una excepción de reparto de clase y el seguimiento apunta a esto:

04-04 21:02:27.036: INFO/TestRunner(431): started: testIt(edu.rockies.rockies.activity.courses.test.TopicTest) 04-04 21:02:27.126: INFO/TestRunner(431): failed: testIt(edu.rockies.rockies.activity.courses.test.TopicTest) 04-04 21:02:27.126: INFO/TestRunner(431): ----- begin exception ----- 04-04 21:02:27.136: INFO/TestRunner(431): java.lang.ClassCastException: android.app.ApplicationContext 04-04 21:02:27.136: INFO/TestRunner(431): at edu.rockies.rockies.activity.courses.test.TopicTest.setUp(TopicTest.java:27) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestCase.runBare(TestCase.java:125) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult$1.protect(TestResult.java:106) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult.runProtected(TestResult.java:124) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestResult.run(TestResult.java:109) 04-04 21:02:27.136: INFO/TestRunner(431): at junit.framework.TestCase.run(TestCase.java:118) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 04-04 21:02:27.136: INFO/TestRunner(431): at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430) 04-04 21:02:27.136: INFO/TestRunner(431): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 04-04 21:02:27.136: INFO/TestRunner(431): ----- end exception ----- 04-04 21:02:27.156: INFO/TestRunner(431): finished: testIt(edu.rockies.rockies.activity.courses.test.TopicTest)

Se supone que this.getInstrumentation().getTargetContext() devuelve un objeto de tipo contexto. Pero obtengo la android.app.ApplicationContext clase android.app.ApplicationContext que no tiene sentido.

Actualización 2:

Hice un poco más de investigación y descubrí esto para android.app.Application

java.lang.Object android.content.Context android.app.ApplicationContext android.app.Application

Pero el propio Java Javadoc de Google se refiere a this :

java.lang.Object android.content.Context android.content.ContextWrapper android.app.Application

¿Que esta pasando? Algo no esta bien.

Actualización 3:

He reemplazado la siguiente línea de código:

this.getInstrumentation().getTargetContext();

Con esta línea de código.

this.getInstrumentation().getTargetContext().getApplicationContext();

Aunque el contexto se resuelve correctamente, no parece ser el mismo contexto que el de la actividad.


Con el marco de prueba de interfaz de usuario más reciente, getInstrumentation() ya no está disponible. Una forma de obtener el objeto de la Application es convertir el Context la aplicación:

Application app = (Application) InstrumentationRegistry .getTargetContext() .getApplicationContext();


Ok, este problema está resuelto. Para obtener acceso al contexto antes de que se haya llamado a getActivity (), debe llamar a esta función:

Context context = this.getInstrumentation().getTargetContext().getApplicationContext();



Siempre use this.getInstrumentation().getTargetContext() para acceder al contexto de la aplicación.

this.getInstrumentation().getTargetContext().getApplicationContext() no es lo mismo que this.getInstrumentation().getTargetContext()

Estaba ejecutando la automatización en las versiones 4.0.X y la mayoría de las veces, getApplicationContext() devolvía un contexto nulo.