Mockk: Upgrade to jdk 12 fails mockk with "io.mockk.MockKException: Can't instantiate proxy"

Created on 21 Mar 2019  路  3Comments  路  Source: mockk/mockk

Prerequisites

Please answer the following questions for yourself before submitting an issue.

  • [x] I am running the latest version
  • [x] I checked the documentation and found no answer
  • [x] I checked to make sure that this issue has not already been filed

Expected Behavior

Junit test runs the same way as with jdk 11.

Current Behavior

All Junit test using mockk fails after upgrading to jdk 12.

Steps to Reproduce

  1. Upgrade from java 11 to java 12
  2. Run the tests that are using mockk and was passing with jdk11.

Context

Please provide any relevant information about your setup. This is important in case the issue is not reproducible except for under certain conditions.

  • MockK version: 1.9.2
  • Bytebuddy 1.9.9
  • OS: mac/apple 10.12.6 sierra
  • Kotlin version: 1.3.11
  • JDK version: open-jdk-12.0.0
  • JUnit version: 4.12
  • Type of test: unit test

Stack trace

// -----------------------[ YOUR STACK STARTS HERE ] -----------------------

io.mockk.MockKException: Can't instantiate proxy for class no.myorg.dep.BootstrappableDataSource

    at io.mockk.impl.instantiation.JvmMockFactory.newProxy(JvmMockFactory.kt:64)
    at io.mockk.impl.instantiation.AbstractMockFactory.newProxy$default(AbstractMockFactory.kt:29)
    at io.mockk.impl.instantiation.AbstractMockFactory.mockk(AbstractMockFactory.kt:59)
    at no.myorg.dep.api.NonSpringHttpControllerTest.<init>(HttpControllerTest.kt:168)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    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:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: io.mockk.proxy.MockKAgentException: Failed to subclass interface no.myorg.dep.BootstrappableDataSource
    at io.mockk.proxy.jvm.ProxyMaker.proxy(ProxyMaker.kt:38)
    at io.mockk.impl.instantiation.JvmMockFactory.newProxy(JvmMockFactory.kt:34)
    ... 25 more
Caused by: java.lang.IllegalArgumentException: Could not create type
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:139)
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:159)
    at io.mockk.proxy.jvm.transformation.SubclassInstrumentation.subclass(SubclassInstrumentation.kt:50)
    at io.mockk.proxy.jvm.ProxyMaker.subclass(ProxyMaker.kt:113)
    at io.mockk.proxy.jvm.ProxyMaker.proxy(ProxyMaker.kt:35)
    ... 26 more
Caused by: java.lang.UnsupportedOperationException: Cannot define class using reflection: override
    at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Initializable$Unavailable.defineClass(ClassInjector.java:336)
    at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:184)
    at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:205)
    at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79)
    at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5023)
    at io.mockk.proxy.jvm.transformation.SubclassInstrumentation.doInterceptedSubclassing(SubclassInstrumentation.kt:97)
    at io.mockk.proxy.jvm.transformation.SubclassInstrumentation.access$doInterceptedSubclassing(SubclassInstrumentation.kt:20)
    at io.mockk.proxy.jvm.transformation.SubclassInstrumentation$subclass$1.call(SubclassInstrumentation.kt:53)
    at io.mockk.proxy.jvm.transformation.SubclassInstrumentation$subclass$1.call(SubclassInstrumentation.kt:20)
    at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:137)
    ... 30 more

Most helpful comment

version 1.9.3 and 1.9.3.kotlin12 released with Java 12 support. thanks to @xiaodong-xie . please check and close issue if everything is OK

All 3 comments

Not nice, will try newer bytebuddy this weekend

version 1.9.3 and 1.9.3.kotlin12 released with Java 12 support. thanks to @xiaodong-xie . please check and close issue if everything is OK

Works like a charm, thank you!

Was this page helpful?
0 / 5 - 0 ratings