Skip to content

Cannot execute any tests in JDK17 envir. Error: "NoSuchMethodException: sun.misc.Unsafe.defineClass(...) " #2521

@johan974

Description

@johan974

The issue is that no matter what I try, I keep in the JDK 17 environment the error: "NoSuchMethodException: sun.misc.Unsafe.defineClass(...) "

Environment is Mockito 2.x, 3.x, 4.2.0 (core). JDK17, Spring Boot 2.5.5.
Either in JUnit 4 or JUnit 5 environment.

The exact error:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class nl.*****.fortesting.ForTestingChild.

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.

The simplified classes are shown below.

What I tried so far is:

  1. Any version of Mockito-core, e.g. 4.2.0.

  2. Remove Mockito core from the spring-boot-test-starter.

  3. Adding net.buddy explicitly

    net.bytebuddy byte-buddy 1.12.3 test net.bytebuddy byte-buddy-agent 1.12.3 test
  4. Using mock( ) or @mock.

  5. Working with a @MockBean or @mock.

  6. With JUnit 4 or JUnit 5.

The simplified sample code:

@service
public class ForTestingChild {
public String getExternalStuff( String input) {
return "Get that external input";
}
}
The is the simplified class using the previous class:

@service
public class ForTestingThisIsParent {
private ForTestingChild forTestingChild;
public ForTestingThisIsParent( ForTestingChild forTestingChild) {
this.forTestingChild = forTestingChild;
}
public String getValueFromChild( String input) {
return forTestingChild.getExternalStuff( input);
}
}
This is the test class:

@RunWith(MockitoJUnitRunner.class)
public class ForTestingThisIsParentTest {
@mock
ForTestingChild forTestingChild;

@InjectMocks
ForTestingThisIsParent forTestingThisIsParent;

@Test
public void testBasic() {
    when( forTestingChild.getExternalStuff( any())).thenReturn( "Simulated external stuff");
    assertEquals( "Simulated external stuff", forTestingThisIsParent.getValueFromChild( "Nonesense stuff"));
}

}

The stacktrace:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class nl.*****.fortesting.ForTestingChild.

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.

Java : 17
JVM vendor name : Oracle Corporation
....

Underlying exception : java.lang.UnsupportedOperationException: Cannot define class using reflection

at org.mockito.internal.runners.DefaultInternalRunner$1.withBefores(DefaultInternalRunner.java:39)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:276)
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.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

Caused by: java.lang.UnsupportedOperationException: Cannot define class using reflection
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Unavailable.defineClass(ClassInjector.java:821)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:185)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:187)
at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4457)
at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:121)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:346)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:161)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:355)
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:65)
at org.mockito.Mockito.mock(Mockito.java:1855)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:36)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:57)
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)
... 21 more
Caused by: java.lang.IllegalStateException: Could not find sun.misc.Unsafe
at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$Disabled.initialize(ClassInjector.java:1366)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe.inject(ClassInjector.java:1202)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$ForUnsafeInjection.load(ClassLoadingStrategy.java:458)
at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4457)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Indirect.make(ClassInjector.java:684)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$CreationAction.run(ClassInjector.java:302)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$CreationAction.run(ClassInjector.java:290)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.(ClassInjector.java:70)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:184)
... 44 more
Caused by: java.lang.NoSuchMethodException: sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)
at java.base/java.lang.Class.getMethod(Class.java:2227)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$CreationAction.run(ClassInjector.java:1269)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$CreationAction.run(ClassInjector.java:1257)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe.(ClassInjector.java:1136)

The package versions:

+- org.springframework.boot:spring-boot-starter:jar:2.5.5:compile
| +- org.springframework.boot:spring-boot:jar:2.5.5:compile
| | - org.springframework:spring-context:jar:5.3.10:compile
| +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.5:compile
| +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
| +- org.springframework:spring-core:jar:5.3.10:compile
| | - org.springframework:spring-jcl:jar:5.3.10:compile
| - org.yaml:snakeyaml:jar:1.28:compile
+- org.springframework.boot:spring-boot-starter-log4j2:jar:2.5.5:compile
| +- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.14.1:compile
| | - org.apache.logging.log4j:log4j-api:jar:2.14.1:compile
| +- org.apache.logging.log4j:log4j-core:jar:2.14.1:compile
| +- org.apache.logging.log4j:log4j-jul:jar:2.14.1:compile
| - org.slf4j:jul-to-slf4j:jar:1.7.32:compile
+- org.springframework.boot:spring-boot-starter-web:jar:2.5.5:compile
| +- org.springframework.boot:spring-boot-starter-json:jar:2.5.5:compile
| | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.12.5:compile
| | - com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.12.5:compile
| +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.5.5:compile
| | +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.53:compile
| | - org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.53:compile
| +- org.springframework:spring-web:jar:5.3.10:compile
| | - org.springframework:spring-beans:jar:5.3.10:compile
| - org.springframework:spring-webmvc:jar:5.3.10:compile
| +- org.springframework:spring-aop:jar:5.3.10:compile
| - org.springframework:spring-expression:jar:5.3.10:compile
+- org.springframework.boot:spring-boot-starter-data-rest:jar:2.5.5:compile
| - org.springframework.data:spring-data-rest-webmvc:jar:3.5.5:compile
| - org.springframework.data:spring-data-rest-core:jar:3.5.5:compile
| +- org.springframework.hateoas:spring-hateoas:jar:1.3.4:compile
| +- org.springframework.plugin:spring-plugin-core:jar:2.0.0.RELEASE:compile
| - org.atteo:evo-inflector:jar:1.2.2:compile
+- org.springframework.boot:spring-boot-starter-data-jpa:jar:2.5.5:compile
| +- org.springframework.boot:spring-boot-starter-aop:jar:2.5.5:compile
| | - org.aspectj:aspectjweaver:jar:1.9.7:compile
| +- org.springframework.boot:spring-boot-starter-jdbc:jar:2.5.5:compile
| | +- com.zaxxer:HikariCP:jar:4.0.3:compile
| | - org.springframework:spring-jdbc:jar:5.3.10:compile
| +- jakarta.transaction:jakarta.transaction-api:jar:1.3.3:compile
| +- jakarta.persistence:jakarta.persistence-api:jar:2.2.3:compile
| +- org.hibernate:hibernate-core:jar:5.4.32.Final:compile
| | +- org.jboss.logging:jboss-logging:jar:3.4.2.Final:compile
| | +- org.javassist:javassist:jar:3.27.0-GA:compile
| | +- net.bytebuddy:byte-buddy:jar:1.10.22:compile
| | +- antlr:antlr:jar:2.7.7:compile
| | +- org.jboss:jandex:jar:2.2.3.Final:compile
| | +- com.fasterxml:classmate:jar:1.5.1:compile
| | +- org.dom4j:dom4j:jar:2.1.3:compile
| | +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.2.Final:compile
| | - org.glassfish.jaxb:jaxb-runtime:jar:2.3.5:compile
| | +- org.glassfish.jaxb:txw2:jar:2.3.5:compile
| | +- com.sun.istack:istack-commons-runtime:jar:3.0.12:compile
| | - com.sun.activation:jakarta.activation:jar:1.2.2:runtime
| +- org.springframework.data:spring-data-jpa:jar:2.5.5:compile
| | +- org.springframework.data:spring-data-commons:jar:2.5.5:compile
| | +- org.springframework:spring-orm:jar:5.3.10:compile
| | - org.springframework:spring-tx:jar:5.3.10:compile
| - org.springframework:spring-aspects:jar:5.3.10:compile
+- org.springframework.boot:spring-boot-starter-validation:jar:2.5.5:compile
| +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.53:compile
| - org.hibernate.validator:hibernate-validator:jar:6.2.0.Final:compile
| - jakarta.validation:jakarta.validation-api:jar:2.0.2:compile
+- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.12.5:compile
| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.12.5:compile
| +- com.fasterxml.jackson.core:jackson-core:jar:2.12.5:compile
| - com.fasterxml.jackson.core:jackson-databind:jar:2.12.5:compile
+- mysql:mysql-connector-java:jar:8.0.25:compile
+- io.jsonwebtoken:jjwt:jar:0.9.1:compile
+- com.jayway.jsonpath:json-path:jar:2.6.0:compile
| +- net.minidev:json-smart:jar:2.4.7:compile
| | - net.minidev:accessors-smart:jar:2.4.7:compile
| - org.slf4j:slf4j-api:jar:1.7.32:compile
+- org.apache.httpcomponents:httpclient:jar:4.5.13:compile
| - org.apache.httpcomponents:httpcore:jar:4.4.14:compile
+- commons-codec:commons-codec:jar:1.15:compile
+- org.springframework.security:spring-security-crypto:jar:5.5.2:compile
+- com.squareup.okhttp3:okhttp:jar:4.9.3:compile
| +- com.squareup.okio:okio:jar:2.8.0:compile
| | - org.jetbrains.kotlin:kotlin-stdlib-common:jar:1.5.31:compile
| - org.jetbrains.kotlin:kotlin-stdlib:jar:1.5.31:compile
| - org.jetbrains:annotations:jar:13.0:compile
+- com.squareup.okhttp3:okhttp-urlconnection:jar:4.9.3:compile
| - org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:1.5.31:compile
| - org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:1.5.31:compile
+- org.springframework.boot:spring-boot-starter-test:jar:2.5.5:test
| +- org.springframework.boot:spring-boot-test:jar:2.5.5:test
| +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.5.5:test
| +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:compile
| | - jakarta.activation:jakarta.activation-api:jar:1.2.2:compile
| +- org.assertj:assertj-core:jar:3.19.0:test
| +- org.hamcrest:hamcrest:jar:2.2:test
| +- org.junit.jupiter:junit-jupiter:jar:5.8.2:test
| | - org.junit.jupiter:junit-jupiter-params:jar:5.8.2:test
| +- org.skyscreamer:jsonassert:jar:1.5.0:test
| | - com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
| +- org.springframework:spring-test:jar:5.3.10:test
| - org.xmlunit:xmlunit-core:jar:2.8.2:test
+- org.junit.jupiter:junit-jupiter-engine:jar:5.8.2:test
| +- org.junit.platform:junit-platform-engine:jar:1.8.2:test
| | +- org.opentest4j:opentest4j:jar:1.2.0:test
| | - org.junit.platform:junit-platform-commons:jar:1.8.2:test
| +- org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test
| - org.apiguardian:apiguardian-api:jar:1.1.2:test
+- org.mockito:mockito-junit-jupiter:jar:4.1.0:test
| - org.mockito:mockito-core:jar:2.24.0:test
| +- net.bytebuddy:byte-buddy-agent:jar:1.10.22:test
| - org.objenesis:objenesis:jar:2.6:test
+- org.springframework.boot:spring-boot-devtools:jar:2.5.5:compile (optional)
+- net.bytebuddy:byte-buddy-dep:jar:1.12.3:compile
| +- org.ow2.asm:asm:jar:9.2:compile
| - org.ow2.asm:asm-commons:jar:9.2:compile
- com.google.code.gson:gson:jar:2.8.9:compile

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