Consulta utilizando MockContentResolver conduce a NullPointerException

Tenemos una clase de prueba de JUnit que extiende ActivityInstrumentationTestCase2<CommentActivity> . La prueba (y la clase que estamos probando) utilizan CommentContentProvider , que extiende ContentProvider , para acceder a la base de datos SQLite, y estamos recibiendo una NullPointerException [seguimiento de pila completa a continuación] al ejecutar una consulta en el proveedor.

Instanciamos un MockContentResolver como se muestra:

 MockContentResolver mResolver; public void setUp() { super.setUp(); CommentContentProvider ccp = new CommentContentProvider(); mResolver = new MockContentResolver(); mResolver.addProvider(CommentContentProvider.AUTHORITY, ccp); } 

Más adelante, en nuestras pruebas, al llamar al siguiente código, obtendremos una NullPointerException :

 Cursor mCursor = mResolver.query(Uri.parse(mUri), null, null, null, null); 

MockContentResolver el mismo resultado incluso si esperamos instanciar MockContentResolver hasta que tengamos una copia de la actividad bajo prueba:

 mActivity = getActivity(); MockContentResolver mResolver = new MockContentResolver(mActivity); 

Hemos verificado que la mActivity no es nula.

Un colega pasó a través de la fuente de Android (no instalado en nuestro sistema) y encontró que la causa inmediata del error es que getContext() devuelve null en la primera línea de ContentProvider.enforceReadPermissionInner () .

Echamos un vistazo a esta pregunta que originalmente parecía similar, pero creo que fue un problema completamente diferente. Esta pregunta es también un síntoma similar de un problema, pero no instanciar su MockContentResolver . Estamos teniendo problemas para instanciar los nuestros.

Aquí está el seguimiento de pila que estamos recibiendo:

 java.lang.NullPointerException at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:449) at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394) at android.content.ContentProvider$Transport.query(ContentProvider.java:194) at android.content.ContentResolver.query(ContentResolver.java:461) at android.content.ContentResolver.query(ContentResolver.java:404) at packagename.test.FooActivityTest.getNumCommentsForRecipient(FooActivityTest.java:84) at packagename.test.FooActivityTest.testCommentEntryInternal(FooActivityTest.java:91) at packagename.test.FooActivityTest.testCommentEntry1(FooActivityTest.java:108) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.access$000(InstrumentationTestCase.java:36) at android.test.InstrumentationTestCase$2.run(InstrumentationTestCase.java:189) at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4998) at java.lang.reflect.Method.invokeNative(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) at dalvik.system.NativeStart.main(Native Method) 

¿Cómo podemos resolver este problema?

Tuve un problema similar al probar un proveedor de contenido que confiaba internamente en otro proveedor de contenido para escribir algunos metadatos.

En primer lugar, puede ser mejor utilizar la clase ProviderTestCase2 , que hará la mayor parte del trabajo para configurar el proveedor bajo prueba para usted. Podría hacer su vida considerablemente más fácil. (Para mí esto no fue suficiente porque sólo te ayudará con un proveedor, necesitaba dos.)

Si esto no es posible para usted, aquí está lo que hizo el truco para mí:

La consulta falla porque su proveedor nunca tuvo un contexto asociado a ella. Usted tiene que hacer esto usted mismo, manualmente – que la documentación olvida mencionar. Hacer esto:

 public void setUp() { super.setUp(); CommentContentProvider ccp = new CommentContentProvider(); // Add this line to attach context: ccp.attachInfo(mActivity, null); mResolver = new MockContentResolver(); mResolver.addProvider(CommentContentProvider.AUTHORITY, ccp); } 

No estoy 100% seguro de qué contexto adjuntar para mantener su prueba aislada del resto del mundo, ProviderTestCase2 establece una cadena entera de contextos simulados. Si tiene problemas, consulte RenamingDelegatingContext y IsolatedContext , esos son los que utiliza ContentProviderTestCase2 . (Eche un vistazo a su método setUp() ).

¡Espero que esto te ayude!

  • Acceder a un método de un fragmento de la actividad ViewPager
  • Cambiar a un fragmento específico da extraño java.lang.NullPointerException
  • NullPointerException Advertencia sobre getView () dentro del método onActivityCreated / onStart / onViewCreated
  • El interruptor se bloquea cuando se hace clic en Android 5.0
  • Android get La barra de acción de soporte siempre devuelve NULL
  • GetActionBar () devuelve Null (AppCompat-v7 21)
  • Android TabHost.addTab -> Excepción de puntero nulo
  • Android google maps nullpointerexception
  • Box.COM integración con una aplicación android-OAuthActivity-Nullpointerexception?
  • Dereference puede producir 'java.lang.NullPointerException'
  • Excepción de puntero nulo al utilizar SearchView con AppCompat
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.