Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mockito cannot mock this class

I am attempting to mock a public class, however when doing so, Mockito throws an Mockito cannot mock this class exception.

Class I wish to mock: https://github.com/scribejava/scribejava/blob/master/scribejava-core/src/main/java/com/github/scribejava/core/builder/ServiceBuilder.java

Test code:

package xyz.jacobclark.adapter;  import com.github.scribejava.apis.TwitterApi; import com.github.scribejava.core.builder.ServiceBuilder; import com.github.scribejava.core.model.OAuth1RequestToken; import com.github.scribejava.core.oauth.OAuth10aService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner;  import java.io.IOException;  import static org.hamcrest.Matchers.is; import static org.hamcrest.core.IsInstanceOf.any;  @RunWith(MockitoJUnitRunner.class) public class TwitterOAuthAdapterTest {     @Mock     ServiceBuilder serviceBuilder;      @Test     public void getRequestTokenShouldReturnAValidRequestToken() throws IOException {         class TwitterOAuthAdapter {             private final OAuth10aService service;              public TwitterOAuthAdapter(ServiceBuilder serviceBuilder){                 this.service = serviceBuilder                     .apiKey("")                     .apiSecret("")                     .build(TwitterApi.instance());             }              public OAuth1RequestToken getRequestToken() throws IOException {                 return this.service.getRequestToken();             }         }          TwitterOAuthAdapter oAuthAdapter = new TwitterOAuthAdapter(serviceBuilder);         Assert.assertThat(oAuthAdapter.getRequestToken(), is(any(OAuth1RequestToken.class)));     } } 

Full stacktrace:

xyz.jacobclark.adapter.TwitterOAuthAdapterTest  org.mockito.exceptions.base.MockitoException:  Mockito cannot mock this class: class com.github.scribejava.core.builder.ServiceBuilder.  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               : 1.8 JVM vendor name    : Oracle Corporation JVM vendor version : 25.0-b70 JVM name           : Java HotSpot(TM) 64-Bit Server VM JVM version        : 1.8.0-b132 JVM info           : mixed mode OS name            : Mac OS X OS version         : 10.11.3   Underlying exception : java.lang.IllegalArgumentException: object is not an instance of declaring class      at org.mockito.internal.runners.SilentJUnitRunner$1.withBefores(SilentJUnitRunner.java:29)     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.SilentJUnitRunner.run(SilentJUnitRunner.java:39)     at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)     at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103)     at org.junit.runner.JUnitCore.run(JUnitCore.java:137)     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:483)     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:483)     at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$ForTypeArgument.resolve(TypeDescription.java:3843)     at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$Delegator$Chained.resolve(TypeDescription.java:3468)     at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$ForTypeArgument.resolve(TypeDescription.java:3803)     at net.bytebuddy.description.type.TypeDescription$Generic$AnnotationReader$Delegator.asList(TypeDescription.java:3439)     at net.bytebuddy.description.type.TypeDescription$Generic$OfWildcardType$ForLoadedType.getDeclaredAnnotations(TypeDescription.java:4748)     at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onWildcard(TypeDescription.java:680)     at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onWildcard(TypeDescription.java:663)     at net.bytebuddy.description.type.TypeDescription$Generic$OfWildcardType.accept(TypeDescription.java:4656)     at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onParameterizedType(TypeDescription.java:691)     at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing.onParameterizedType(TypeDescription.java:663)     at net.bytebuddy.description.type.TypeDescription$Generic$OfParameterizedType.accept(TypeDescription.java:4998)     at net.bytebuddy.description.type.TypeList$Generic$AbstractBase.accept(TypeList.java:249)     at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$TypeVariableErasing$RetainedTypeVariable.getUpperBounds(TypeDescription.java:832)     at net.bytebuddy.description.type.TypeDescription$Generic$OfTypeVariable.asErasure(TypeDescription.java:5373)     at net.bytebuddy.description.method.MethodDescription$AbstractBase.asTypeToken(MethodDescription.java:701)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Harmonized.of(MethodGraph.java:881)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Store.registerTopLevel(MethodGraph.java:1074)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.doAnalyze(MethodGraph.java:588)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.analyze(MethodGraph.java:548)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.analyzeNullable(MethodGraph.java:567)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.doAnalyze(MethodGraph.java:581)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.compile(MethodGraph.java:521)     at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$AbstractBase.compile(MethodGraph.java:442)     at net.bytebuddy.dynamic.scaffold.MethodRegistry$Default.prepare(MethodRegistry.java:480)     at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:160)     at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:153)     at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2568)     at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2670)     at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:84)     at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$CachedBytecodeGenerator.getOrGenerateMockClass(TypeCachingBytecodeGenerator.java:91)     at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:38)     at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMockType(SubclassByteBuddyMockMaker.java:67)     at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:38)     at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:26)     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:1637)     at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)     at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)     at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:39)     at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.java:63)     at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:59)     at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:43)     at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:67)     ... 23 more   Test ignored. Process finished with exit code 255 
like image 960
Jacob Clark Avatar asked Dec 08 '16 22:12

Jacob Clark


2 Answers

Even though it's not specifically answering the question (question is Java 8), I came here via Google. Using Java 11, I solved this issue by including the following dependency in build.gradle:

compile group: 'org.mockito', name: 'mockito-core', version: '2.22.0'

as discussed here

like image 135
JoschJava Avatar answered Sep 23 '22 03:09

JoschJava


It is because of Java/Mockito compatibility. For example, if you are using Java 11 with Mockito 2.17.0, it will throw the same error (Upgrading to Mockito 2.22.0 or later will solve it). Aside from digging into their release artifact on Github, I am yet to see a comprehensive document that spells out the compatibility matrix. Here is a helpful compatibility Matrix (based on quick test)

  • Mockito * - 2.17.0 => Java 8

(footnote: * - dont know how far back)

  • Mockito 2.18.0 - 3.2.4 => Java 11
like image 42
papigee Avatar answered Sep 24 '22 03:09

papigee