Android Instrumentation test java.lang.UnsatisfiedLinkError on using AndroidJunitRunner and AndroidJUnit4

Kanishk

I am using robolectric in our unit tests. Recently in our project, we are adding a new dependency from zendesk.

repositories {

    maven {
        url 'https://zendesk.artifactoryonline.com/zendesk/repo'
    }
}

compile group: 'com.zendesk', name: 'sdk', version: '1.3.0.1'

Now we have not even referenced any class from this library and we are getting exceptions in our robolectric unit tests just by adding this dependency. I thought the problem is in our project, but its also occurring on a sample robolectric test project.

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)
Kanishk

Found the fix for this. We were not using zendesk code in our test cases. The broadcast receivers from the added dependency(zendesk) were getting added to AndroidManifest.xml through the gradle build. The RobolectricTestRunner class parses the manifest into its internal ApplicationManifest object and then sets up application state through ShadowApplication class. The ShadowApplication class registers broadcast receivers from the application manifest. This is where I was getting the above error.

Fix: We have a custom test runner that extends RobolectricGradleTestRunner. In that I have overriden the getAppManifest method and removed the broadcast receivers not required. I know its a kind of workaround but there was no other alternative. Didn't want to create another manifest and create duplication. Here's the code snippet.

@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;
}

The DELETE_BROADCAST_PACKAGE is simply a String hashset. Containing the package hierarchy name

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Test recreating Android Activity using instrumentation and JUnit4

From Dev

java.lang.UnsatisfiedLinkError when using with android 5.0

From Dev

Android prob with AndroidJUnitRunner giving 'java.lang.ClassNotFoundException'

From Dev

AndroidJUnit4 Test: Keep activity alive

From Dev

Android - Scandit - java.lang.UnsatisfiedLinkError

From Dev

java.lang.UnsatisfiedLinkError error in android

From Dev

java.lang.UnsatisfiedLinkError error in android

From Dev

android instrumentation test for listview

From Dev

Instrumentation test using Messenger

From Dev

INSTRUMENTATION_RESULT: shortMsg=java.lang.NoClassDefFoundError running Android Instrumentation tests

From Dev

INSTRUMENTATION_RESULT: shortMsg=java.lang.NoClassDefFoundError running Android Instrumentation tests

From Dev

Jenkins and Running AndroidJUnitRunner Instrumentation Tests

From Dev

java.lang.UnsatisfiedLinkError exception when using TESSERACT API in Java

From Dev

Android instrumentation test dexing error

From Dev

FATAL EXCEPTION: main java.lang.UnsatisfiedLinkError in Android Studio library

From Dev

Running android native code is causing java.lang.UnsatisfiedLinkError

From Dev

java.lang.UnsatisfiedLinkError when loading native library in Android 5.0

From Dev

java.lang.UnsatisfiedLinkError after updating to Android 5.0

From Dev

java.lang.UnsatisfiedLinkError - NDK in android studio gradle?

From Dev

Android M crash java.lang.UnsatisfiedLinkError: dlopen failed:

From Dev

Android - java.lang.UnsatisfiedLinkError: Native method not found

From Dev

java.lang.UnsatisfiedLinkError when using JNI on ubuntu

From Dev

Using JavaCV and Realm together causes "java.lang.UnsatisfiedLinkError"

From Dev

"Test failed to run to completion. Instrumentation run failed due to 'java.lang.NullPointerException''

From Dev

Instrumentation run failed due to 'java.lang.IllegalAccessError' in Robotium test project with actionbar sherlock

From Dev

Tess4j issue java.lang.UnsatisfiedLinkError

From Dev

Tess4j issue java.lang.UnsatisfiedLinkError

From Dev

OpenCV java.lang.UnsatisfiedLinkError

From Dev

eclipse: java.lang.UnsatisfiedLinkError

Related Related

  1. 1

    Test recreating Android Activity using instrumentation and JUnit4

  2. 2

    java.lang.UnsatisfiedLinkError when using with android 5.0

  3. 3

    Android prob with AndroidJUnitRunner giving 'java.lang.ClassNotFoundException'

  4. 4

    AndroidJUnit4 Test: Keep activity alive

  5. 5

    Android - Scandit - java.lang.UnsatisfiedLinkError

  6. 6

    java.lang.UnsatisfiedLinkError error in android

  7. 7

    java.lang.UnsatisfiedLinkError error in android

  8. 8

    android instrumentation test for listview

  9. 9

    Instrumentation test using Messenger

  10. 10

    INSTRUMENTATION_RESULT: shortMsg=java.lang.NoClassDefFoundError running Android Instrumentation tests

  11. 11

    INSTRUMENTATION_RESULT: shortMsg=java.lang.NoClassDefFoundError running Android Instrumentation tests

  12. 12

    Jenkins and Running AndroidJUnitRunner Instrumentation Tests

  13. 13

    java.lang.UnsatisfiedLinkError exception when using TESSERACT API in Java

  14. 14

    Android instrumentation test dexing error

  15. 15

    FATAL EXCEPTION: main java.lang.UnsatisfiedLinkError in Android Studio library

  16. 16

    Running android native code is causing java.lang.UnsatisfiedLinkError

  17. 17

    java.lang.UnsatisfiedLinkError when loading native library in Android 5.0

  18. 18

    java.lang.UnsatisfiedLinkError after updating to Android 5.0

  19. 19

    java.lang.UnsatisfiedLinkError - NDK in android studio gradle?

  20. 20

    Android M crash java.lang.UnsatisfiedLinkError: dlopen failed:

  21. 21

    Android - java.lang.UnsatisfiedLinkError: Native method not found

  22. 22

    java.lang.UnsatisfiedLinkError when using JNI on ubuntu

  23. 23

    Using JavaCV and Realm together causes "java.lang.UnsatisfiedLinkError"

  24. 24

    "Test failed to run to completion. Instrumentation run failed due to 'java.lang.NullPointerException''

  25. 25

    Instrumentation run failed due to 'java.lang.IllegalAccessError' in Robotium test project with actionbar sherlock

  26. 26

    Tess4j issue java.lang.UnsatisfiedLinkError

  27. 27

    Tess4j issue java.lang.UnsatisfiedLinkError

  28. 28

    OpenCV java.lang.UnsatisfiedLinkError

  29. 29

    eclipse: java.lang.UnsatisfiedLinkError

HotTag

Archive