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.
- JUnit prueba para la aplicación de Android con fragmentos
- Diferencia entre el método runOnUiThread () y la anotación @UiThreadTest
- No se pudieron determinar las dependencias para todas las tareas con robolectric gradle plugin
- Obtener resultado de una actividad después de terminar (); En una prueba de unidad de Android
- Cómo obtener la salida de registro de Android mostrada con las pruebas de JUnit (utilizando JUnit nativo sin emulador)
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)
- ¿Qué hace testAndroidTestCaseSetUpProperly hacer
- Módulo de prueba de inyección con dagger2
- Ejecute una sola prueba de Android (unidad) desde gradle sin cargar otras dependencias de proyecto
- Android Studio No se puede resolver el símbolo 'Before' en import org.junit.Before
- Prueba de la clase de comunicación con DB a través de DAO de ORMLite
- Prueba de la unidad Android - Problemas de resolución y verificación
- ¿Intentar ejecutar Android JUnit pruebas en Eclipse falla?
- Unidad de prueba SparseArray utilizando JUnit (utilizando JVM)
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
- ¿Es posible ver variables en tiempo de ejecución?
- Transición de elementos compartidos y Fresco no funcionan correctamente