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();
Puedes llamar al método estático para el contexto:
Context context = InstrumentationRegistry.getTargetContext();
Más detalles se pueden encontrar aquí: https://developer.android.com/training/testing/integration-testing/index.html
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.