Android instrumentación prueba java.lang.UnsatisfiedLinkError en el uso de AndroidJunitRunner y AndroidJUnit4

Estoy usando robolectric en nuestras pruebas unitarias. Recientemente en nuestro proyecto, estamos agregando una nueva dependencia de zendesk.

repositories { maven { url 'https://zendesk.artifactoryonline.com/zendesk/repo' } } compile group: 'com.zendesk', name: 'sdk', version: '1.3.0.1' 

Ahora ni siquiera hemos hecho referencia a ninguna clase de esta biblioteca y estamos recibiendo excepciones en nuestras pruebas de unidad roboeléctrica simplemente añadiendo esta dependencia. Pensé que el problema está en nuestro proyecto, pero también está ocurriendo en un proyecto de prueba robolectric de la muestra.

 java.lang.VerifyError: Expecting a stackmap frame at branch target 31 Exception Details: Location: com/zendesk/sdk/power/BatteryStateBroadcastReceiver.onReceive(Landroid/content/Context;Landroid/content/Intent;) V @13: ifnonnull Reason: Expected stackmap frame at this location. Bytecode: 0x0000000: b200 1212 0703 bd00 0fb8 0015 2cc7 0012 0x0000010: b200 1212 0303 bd00 0fb8 0017 a700 66b2 0x0000020: 0012 bb00 1159 b700 1c12 04b6 001d 2cb6 0x0000030: 0014 b600 1db6 001e 03bd 000f b800 1512 0x0000040: 062c b600 14b6 001b 9900 1ab2 0012 1202 0x0000050: 03bd 000f b800 162b b800 1804 b600 19a7 0x0000060: 0023 1205 2cb6 0014 b600 1b99 0017 b200 0x0000070: 1212 0103 bd00 0fb8 0016 2bb8 0018 03b6 0x0000080: 0019 b200 1212 0803 bd00 0fb8 0015 b1 at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.robolectric.internal.Shadow.newInstanceOf(Shadow.java:15) at org.robolectric.shadows.ShadowApplication.registerBroadcastReceivers(ShadowApplication.java:148) at org.robolectric.shadows.ShadowApplication.bind(ShadowApplication.java:137) at org.robolectric.shadows.CoreShadowsAdapter.bind(CoreShadowsAdapter.java:99) at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:121) at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:421) at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234) at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:185) at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:149) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

Encontrado la solución para esto. No estábamos utilizando el código zendesk en nuestros casos de prueba. Los receptores de difusión de la dependencia añadida (zendesk) se estaban añadiendo a AndroidManifest.xml a través de la compilación gradle. La clase RobolectricTestRunner analiza el manifiesto en su objeto ApplicationManifest interno y, a continuación, establece el estado de la aplicación a través de la clase ShadowApplication. La clase ShadowApplication registra receptores de difusión del manifiesto de aplicación. Aquí es donde yo estaba recibiendo el error anterior.

Solución: Tenemos un corredor de prueba personalizado que extiende RobolectricGradleTestRunner. En que he superado el método getAppManifest y eliminado los receptores de difusión no es necesario. Sé que es una especie de solución, pero no había otra alternativa. No quería crear otro manifiesto y crear duplicación. Aquí está el fragmento de código.

 @Override protected AndroidManifest getAppManifest(org.robolectric.annotation.Config config) { AndroidManifest manifest = super.getAppManifest(config); List<BroadcastReceiverData> broadcastReceivers = manifest.getBroadcastReceivers(); List<BroadcastReceiverData> removeList = new ArrayList<>(); for(BroadcastReceiverData receiverData : broadcastReceivers) { if(isDeletePackage(receiverData.getClassName())) { removeList.add(receiverData); } } broadcastReceivers.removeAll(removeList); return manifest; } private boolean isDeletePackage(String className) { for(String s : DELETE_BROADCAST_PACKAGE) { if(className.startsWith(s)) { return true; } } return false; } 

El DELETE_BROADCAST_PACKAGE es simplemente un hashset de cadena. Contiene el nombre de jerarquía del paquete

  • Prueba de unidad Android: connectedAndroidTest no ejecuta mi caso de prueba
  • Android TestRunner falla debido a la excepción de IllegalState
  • Android RxJava 2 Prueba JUnit - getMainLooper en android.os.Looper no se burla de RuntimeException
  • Android Robolectric unidad de prueba de Marshmallow PermissionHelper
  • Fragmento getActivity () devuelve null en la actividad JUnit test
  • Prueba de DialogFragments con Robolectric
  • Android Eclipse Plugin: Prueba de Instrumentación Runner no especificado
  • La mejor manera de ejecutar pruebas rápidas de JUnit en un proyecto Android en Android Studio
  • Prueba de RxJava2 usando Espresso y obtener una excepción de puntero nulo cuando suscribeOn
  • Prueba JUnit con Robolectric: java.lang.InstantiationException
  • Instrumentation.ActivityMonitor no monitoreando Intent.ACTION_CALL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.