mockito: Byte buddy exceptions cause Android instrumented tests to fail.

Background:
I attempted to upgrade a fairly large project from mockitio 1x to 2x. I discovered that mockito 2 tests work only when run using the gradle wrapper, not when launched more directly with adb. The gradle wrapper is sufficient for smaller projects but we are using adb for its ability to shard tests across multiple agents. Mockito 1.x does not have this limitation.

Environment: OS: OSX 10.12.2 IDE: Android Studio 2.3 Beta 2 Android Device: Emulator API 24

Steps:

  1. Create new Android Studio project (Application name: Scheme, Company domain: countolaf.example.com, Min SDK: 19, Type: Empty Activity) NOTE) A single empty unit test has been created on our behalf.
  2. Add mockito dependency to the application’s build.gradle (androidTestCompile org.mockito:mockito-android:2.6.3")
  3. Launch emulator (API 24 in this case)
  4. Build and install the application /gradlew clean installDebug installDebugAndroidTest
  5. Launch instumented tests using gradle ./gradlew connectedAndroidTest
  6. OBSERVE The following exceptions printed to logcat
02-02 13:02:18.410  4181  4196 I art     : Rejecting re-init on previously-failed class java.lang.Class<net.bytebuddy.agent.builder.ResettableClassFileTransformer>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/instrument/ClassFileTransformer;
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.410  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.410  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.410  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.410  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.410  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
02-02 13:02:18.410  4181  4196 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.instrument.ClassFileTransformer" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.example.countolaf.scheme.test-2/base.apk", zip file "/data/app/com.example.countolaf.scheme-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.countolaf.scheme.test-2/lib/x86_64, /data/app/com.example.countolaf.scheme-2/lib/x86_64, /system/lib64, /vendor/lib64]]
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.410  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.410  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.410  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.410  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.410  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.410  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
02-02 13:02:18.410  4181  4196 I art     :
02-02 13:02:18.410  4181  4196 E TestLoader: Could not find class: net.bytebuddy.agent.builder.ResettableClassFileTransformer
02-02 13:02:18.432  4181  4196 I art     : Rejecting re-init on previously-failed class java.lang.Class<net.bytebuddy.jar.asm.commons.JSRInlinerAdapter>: java.lang.NoClassDefFoundError: Failed resolution of: Lnet/bytebuddy/jar/asm/tree/MethodNode;
02-02 13:02:18.432  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.433  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.433  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.433  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.433  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.433  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
02-02 13:02:18.433  4181  4196 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "net.bytebuddy.jar.asm.tree.MethodNode" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.example.countolaf.scheme.test-2/base.apk", zip file "/data/app/com.example.countolaf.scheme-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.countolaf.scheme.test-2/lib/x86_64, /data/app/com.example.countolaf.scheme-2/lib/x86_64, /system/lib64, /vendor/lib64]]
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.433  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.433  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.433  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.433  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.433  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.433  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
02-02 13:02:18.433  4181  4196 I art     :
02-02 13:02:18.434  4181  4196 E TestLoader: Could not find class: net.bytebuddy.jar.asm.commons.JSRInlinerAdapter
02-02 13:02:18.437  4181  4196 I art     : Rejecting re-init on previously-failed class java.lang.Class<net.bytebuddy.jar.asm.commons.TryCatchBlockSorter>: java.lang.NoClassDefFoundError: Failed resolution of: Lnet/bytebuddy/jar/asm/tree/MethodNode;
02-02 13:02:18.437  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.437  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.437  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.437  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.437  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.437  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.437  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.437  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.437  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
02-02 13:02:18.437  4181  4196 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "net.bytebuddy.jar.asm.tree.MethodNode" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.example.countolaf.scheme.test-2/base.apk", zip file "/data/app/com.example.countolaf.scheme-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.countolaf.scheme.test-2/lib/x86_64, /data/app/com.example.countolaf.scheme-2/lib/x86_64, /system/lib64, /vendor/lib64]]
02-02 13:02:18.437  4181  4196 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:400)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.doLoadClass(java.lang.String) (TestLoader.java:92)
02-02 13:02:18.438  4181  4196 I art     :   at java.lang.Class android.support.test.internal.runner.TestLoader.loadIfTest(java.lang.String) (TestLoader.java:113)
02-02 13:02:18.438  4181  4196 I art     :   at void android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(android.support.test.internal.runner.TestLoader, java.util.Set) (TestRequestBuilder.java:801)
02-02 13:02:18.438  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.internal.runner.TestRequestBuilder.build() (TestRequestBuilder.java:747)
02-02 13:02:18.438  4181  4196 I art     :   at android.support.test.internal.runner.TestRequest android.support.test.runner.AndroidJUnitRunner.buildRequest(android.support.test.internal.runner.RunnerArgs, android.os.Bundle) (AndroidJUnitRunner.java:354)
02-02 13:02:18.438  4181  4196 I art     :   at void android.support.test.runner.AndroidJUnitRunner.onStart() (AndroidJUnitRunner.java:260)
02-02 13:02:18.438  4181  4196 I art     :   at void android.app.Instrumentation$InstrumentationThread.run() (Instrumentation.java:1932)
  1. OBSERVE That the exceptions have not caused the unit test to fail.
  2. Run the gradle install tasks again ./gradlew installDebug installDebugAndroidTest
  3. Run the package manager command to display the device’s currently installed instrumented packages adb shell pm list instrumentation, locate test app in output example: instrumentation:com.example.countolaf.scheme.test/android.support.test.runner.AndroidJUnitRunner (target=com.example.countolaf.scheme)
  4. copy the package/runner portion (com.example.countolaf.scheme.test/android.support.test.runner.AndroidJUnitRunner)
  5. Run the same unit tests using the Android activity manager (am) adb shell am instrument -w com.example.countolaf.scheme.test/android.support.test.runner.AndroidJUnitRunner RESULT) The same exceptions have occurred but are considered test failures.

EDIT by @bric3 : improved markdown formatting for better readability

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Comments: 32 (23 by maintainers)

Most upvoted comments

I’m proposing this issue be opened again. It hasn’t been fixed on Android Testing Support Library 1.0.0. I’ve actually tested with 1.0.2 and it is still there. Also, the above AOSP patch hasn’t been merged either.

We’re seeing this now from moving from testing 1.0.2 to 1.1.1 (via androidx)

Nothing helped but downgrading mockito to 2.22.0

With test runner 1.0.0, this issue seems to be solved.

repositories {
    google()
}

dependencies {
    androidTestCompile 'com.android.support.test:runner:1.0.0'
}

@knutvalen, I filed a patch, but unfortunately I have no reply from the AOSP team… To avoid this problem, please try the above workground.

I also faced this issue and found a workaround.

Workaround

Add the following AndroidManifest.xml to your androidTest directory.

<!--
The workaround for Mockito issue #922
https://github.com/mockito/mockito/issues/922
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package=[your test package]>
    <!--suppress AndroidDomInspection -->
    <instrumentation>
        <!--suppress AndroidElementNotAllowed -->
        <meta-data
            android:name="notPackage"
            android:value="net.bytebuddy" />
    </instrumentation>
</manifest>

Or if using your own AndroidJUnitRunner, you can also set the notPackage option on onCreate().

public class YourAndroidJUnitRunner extends AndroidJUnitRunner {
    @Override
    public void onCreate(Bundle arguments) {
        /*
        The workaround for Mockito issue #922
        https://github.com/mockito/mockito/issues/922
        */
        arguments.putString("notPackage", "net.bytebuddy");
        super.onCreate(arguments);
    }
}