Skip to content

Version 1.14.0 introduces class redefinition failed: invalid class in Android local tests #1375

@bddckr

Description

@bddckr

On MockK version 1.13.17, this code in the test folder of an Android library project works:

package mypackage

import android.net.Uri
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.unmockkStatic
import org.junit.jupiter.api.Test

class Test {
    @Test
    fun test() {
        try {
            mockkStatic(Uri::class)
            every { Uri.parse(any()) } answers { mockk() }
        } finally {
            unmockkStatic(Uri::class)
        }
    }
}

But in MockK 1.14.0 it fails:

class redefinition failed: invalid class
java.lang.InternalError: class redefinition failed: invalid class
	at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
	at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(Unknown Source)
	at io.mockk.proxy.jvm.transformation.JvmInlineInstrumentation.retransform(JvmInlineInstrumentation.kt:28)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation$doCancel$1.invoke(RetransformInlineInstrumentation.kt:38)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation$doCancel$1.invoke(RetransformInlineInstrumentation.kt:32)
	at io.mockk.proxy.common.transformation.ClassTransformationSpecMap.applyTransformation(ClassTransformationSpecMap.kt:41)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation.doCancel(RetransformInlineInstrumentation.kt:32)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation.access$doCancel(RetransformInlineInstrumentation.kt:6)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation$execute$1$1.invoke(RetransformInlineInstrumentation.kt:17)
	at io.mockk.proxy.common.transformation.RetransformInlineInstrumentation$execute$1$1.invoke(RetransformInlineInstrumentation.kt:17)
	at io.mockk.proxy.common.CancelableResult.cancel(CancelableResult.kt:22)
	at io.mockk.proxy.common.CancelableResult$alsoOnCancel$1.invoke(CancelableResult.kt:30)
	at io.mockk.proxy.common.CancelableResult$alsoOnCancel$1.invoke(CancelableResult.kt:29)
	at io.mockk.proxy.common.CancelableResult.cancel(CancelableResult.kt:22)
	at io.mockk.impl.instantiation.JvmStaticMockFactory$staticMockk$3.invoke(JvmStaticMockFactory.kt:45)
	at io.mockk.impl.instantiation.JvmStaticMockFactory$staticMockk$3.invoke(JvmStaticMockFactory.kt:45)
	at io.mockk.impl.stub.MockKStub.dispose(MockKStub.kt:321)
	at io.mockk.impl.instantiation.JvmStaticMockFactory$staticMockk$4.invoke(JvmStaticMockFactory.kt:55)
	at io.mockk.impl.instantiation.JvmStaticMockFactory$staticMockk$4.invoke(JvmStaticMockFactory.kt:50)
	at io.mockk.MockKCancellationRegistry$RegistryPerType.cancel(API.kt:2530)
	at mypackage.Test.test(Test.kt:80)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at java.base/java.util.ArrayList.forEach(Unknown Source)
	at java.base/java.util.ArrayList.forEach(Unknown Source)

Versions used:

  • MockK: 1.14.0
  • Android Gradle Plugin: 8.9.1
  • Kotlin: 2.1.20

I've also tried depending on net.bytebuddy:byte-buddy and net.bytebuddy:byte-buddy-agent in this project to change the resolved version that's used. I then set it to the latest available Byte Buddy version - 1.17.5. This didn't change anything - it's still failing the same way.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions