mockito / mockito-kotlin

Using Mockito with Kotlin
MIT License
3.1k stars 200 forks source link

Mockito cannot mock this class: interface. Mockito can only mock non-private & non-final classes. #384

Closed hiftikha closed 4 years ago

hiftikha commented 4 years ago
2020-06-25 00:05:54.814 28883-28883/com.vida.healthcoach.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.vida.healthcoach.debug, PID: 28883
    java.lang.RuntimeException: Unable to create application com.vida.healthcoach.VidaApplication: org.mockito.exceptions.base.MockitoException: 
    Mockito cannot mock this class: interface com.vida.client.manager.CoachProfileManager.

    Mockito can only mock non-private & non-final classes.
    If you're not sure why you're getting this error, please report to the mailing list.

    IMPORTANT INFORMATION FOR ANDROID USERS:

    The regular Byte Buddy mock makers cannot generate code on an Android VM!
    To resolve this, please use the 'mockito-android' dependency for your application:
    http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mockito-android%22%20g%3A%22org.mockito%22

    Java               : 0.9
    JVM vendor name    : The Android Project
    JVM vendor version : 2.1.0
    JVM name           : Dalvik
    JVM version        : 0.9
    JVM info           : null
    OS name            : Linux
    OS version         : 4.4.210-perf+

Underlying exception : java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#defineClass
        at com.vida.client.global.VidaModule.<init>(VidaModule.kt:509)
        at com.vida.client.global.VidaModule.<init>(VidaModule.kt:130)
        at com.vida.client.global.Injector.initialize(Injector.kt:93)
        at com.vida.healthcoach.VidaApplication.onCreate(VidaApplication.java:428)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1189)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6460)
            ... 8 more
     Caused by: java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#defineClass
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Direct.defineClass(ClassInjector.java:609)
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:236)
        at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:112)
        at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:232)
        at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:100)
        at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5662)
        at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:173)
        at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
2020-06-25 00:05:54.814 28883-28883/com.vida.healthcoach.debug E/AndroidRuntime:     at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
        at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:152)
        at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:365)
        at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:174)
        at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:376)
        at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:32)
        at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMockType(SubclassByteBuddyMockMaker.java:71)
        at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:42)
        at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
        at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
        at org.mockito.internal.MockitoCore.mock(MockitoCore.java:63)
        at org.mockito.Mockito.mock(Mockito.java:1908)
            ... 14 more
     Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
        at java.lang.ClassLoader.defineClass(ClassLoader.java:591)
        at java.lang.reflect.Method.invoke(Native Method)
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Direct.defineClass(ClassInjector.java:605)
            ... 33 more
2020-06-25 00:05:55.082 28883-28883/com.vida.healthcoach.debug I/Process: Sending signal. PID: 28883 SIG: 9

App crashes after install before launching. My interface is public, and I I've been getting this issue since yesterday only. Nothing specific about gradle or dependency versions have changed in my project and I'm unable to get to the root cause of this. Below is the state of my dependencies:

    testImplementation 'org.mockito:mockito-android:3.1.0'
    testImplementation('com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0') {
        exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib'
        exclude group: 'org.jetbrains.kotlin', module: 'kotlin-reflect'
    }
bohsen commented 4 years ago

You can't use inline-mock-maker in Instrumentation Tests.