Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mockito error in Spring Boot tests after migrating to JDK 11

I have just migrated to JDK 11 in order to use the latest Java LTS version. If I change the execution JRE in Eclipse from 10 to 11 (and only then), when I try to run my tests, I get the following exception stacktrace.

Please note that everything works as expected if I switch back to jdk-10. I use Spring Boot and my tests also use Mockito. My pom.xml is also shown here.

Is there a known incompatibility between Spring Boot and/or Mockito with jdk-11? Perhaps another reference missing in pom.xml?

pom.xml:

    <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.0.5.RELEASE</version>     </parent>      <dependencies>         <dependency>             <groupId>org.glassfish.jaxb</groupId>             <artifactId>jaxb-runtime</artifactId>             <version>2.3.0.1</version>         </dependency>         <dependency>             <groupId>javax.activation</groupId>             <artifactId>activation</artifactId>             <version>1.1.1</version>         </dependency>         <dependency>             <groupId>javax.transaction</groupId>             <artifactId>jta</artifactId>             <version>1.1</version>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <dependency>             <groupId>org.apache.maven</groupId>             <artifactId>maven-model</artifactId>             <version>3.5.4</version>         </dependency>         <dependency>             <groupId>org.modelmapper</groupId>             <artifactId>modelmapper</artifactId>             <version>2.2.0</version>         </dependency>         <dependency>             <groupId>com.h2database</groupId>             <artifactId>h2</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-jpa</artifactId>         </dependency>         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>             <optional>true</optional>         </dependency>         <dependency>             <!-- update Hibernate dependency on Javassist to 3.23.1 for Java 11 compatibility -->             <groupId>org.javassist</groupId>             <artifactId>javassist</artifactId>             <version>3.23.1-GA</version>         </dependency>     </dependencies>     <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>                 <configuration>                     <executable>true</executable>                     <skipTests>true</skipTests>                 </configuration>                 <executions>                     <execution>                         <goals>                             <goal>repackage</goal>                         </goals>                     </execution>                 </executions>             </plugin>         </plugins>     </build>      <repositories>         <repository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </repository>     </repositories>     <pluginRepositories>         <pluginRepository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </pluginRepository>     </pluginRepositories> 

Stacktrace:

java.lang.IllegalStateException: Failed to load ApplicationContext     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)     at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)     at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)     at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)     at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)     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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)     at org.junit.runners.Suite.runChild(Suite.java:128)     at org.junit.runners.Suite.runChild(Suite.java:27)     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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) Caused by: org.mockito.exceptions.base.MockitoException:  Mockito cannot mock this class: class org.foo.MockedClass.  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               : 11 JVM vendor name    : Oracle Corporation JVM vendor version : 11+28 JVM name           : Java HotSpot(TM) 64-Bit Server VM JVM version        : 11+28 JVM info           : mixed mode OS name            : Linux OS version         : 4.4.0-128-generic   Underlying exception : java.lang.UnsupportedOperationException: Cannot define class using reflection     at org.springframework.boot.test.mock.mockito.MockDefinition.createMock(MockDefinition.java:157)     at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.createMock(MockitoPostProcessor.java:222)     at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.registerMock(MockitoPostProcessor.java:192)     at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.register(MockitoPostProcessor.java:174)     at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.postProcessBeanFactory(MockitoPostProcessor.java:144)     at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.postProcessBeanFactory(MockitoPostProcessor.java:131)     at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:282)     at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:170)     at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694)     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780)     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)     at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)     at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:139)     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)     ... 33 more 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)     ... 49 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(Native Method)     at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.<clinit>(ClassInjector.java:70)     at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:184)     ... 65 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:2109)     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(Native Method)     at net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe.<clinit>(ClassInjector.java:1136)     ... 74 more 
like image 688
Pantelis Natsiavas Avatar asked Sep 27 '18 09:09

Pantelis Natsiavas


People also ask

Does spring boot include Mockito?

Spring Boot provides a number of useful tools for testing your application. The spring-boot-starter-parent POM provides JUnit, Hamcrest and Mockito “test” scope dependencies. There are also useful test utilities in the core spring-boot module under the org.

What is the use of Mockito in spring boot?

Mockito is used to mock interfaces so that a dummy functionality can be added to a mock interface that can be used in Unit Testing. Unit Testing is a type of software testing in which individual components of the software are tested.

What is java Mockito?

Mockito is a java based mocking framework, used in conjunction with other testing frameworks such as JUnit and TestNG. It internally uses Java Reflection API and allows to create objects of a service. A mock object returns a dummy data and avoids external dependencies.

Is Mockito only for Java?

The mocking technique is not only used in Java but also used in any object-oriented programming language. There are many frameworks available in Java for mocking, but Mockito is the most popular framework among them. To mock objects, you need to understand the three key concepts of mocking, i.e., stub, fake, and mock.


1 Answers

Was the same problem. Add Mockito 2.22.0 to dependencies. Everything seems to work.

compile group: 'org.mockito', name: 'mockito-core', version: '2.22.0' 
like image 105
user3904219 Avatar answered Sep 20 '22 21:09

user3904219