mockito / mockito-kotlin

Using Mockito with Kotlin
MIT License
3.09k stars 198 forks source link

MyClass$MockitoMock$ must be defined in the same package MyClass/package #424

Open CluEleSsUK opened 3 years ago

CluEleSsUK commented 3 years ago

I'm trying to mock a simple interface in my Kotlin project, but receiving the following error:

Mockito cannot mock this class: interface MyInterface.

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               : 14
JVM vendor name    : AdoptOpenJDK
JVM vendor version : 14.0.2+12
JVM name           : OpenJDK 64-Bit Server VM
JVM version        : 14.0.2+12
JVM info           : mixed mode, sharing
OS name            : Mac OS X
OS version         : 10.15.7

Underlying exception : java.lang.IllegalArgumentException: MyInterface$MockitoMock$1283026015 must be defined in the same package as MyInterface/package
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: interface MyInterface.

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               : 14
JVM vendor name    : AdoptOpenJDK
JVM vendor version : 14.0.2+12
JVM name           : OpenJDK 64-Bit Server VM
JVM version        : 14.0.2+12
JVM info           : mixed mode, sharing
OS name            : Mac OS X
OS version         : 10.15.7

Underlying exception : java.lang.IllegalArgumentException: MyInterface$MockitoMock$1283026015 must be defined in the same package as MyInterface/package
  at cluelessuk.MyInterfaceTest.<init>(MyInterfaceTest.kt:127)
  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:250)
  at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:260)
  at org.junit.runners.BlockJUnit4ClassRunner$2.runReflectiveCall(BlockJUnit4ClassRunner.java:309)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:306)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
  at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
-- VISUAL --
  at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.base/java.lang.reflect.Method.invoke(Method.java:564)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
  at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
  at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
  at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.base/java.lang.reflect.Method.invoke(Method.java:564)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
  at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
  at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
  at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
  at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
  at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
  at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
  at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
  at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
  at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.IllegalArgumentException: MyInterface$MockitoMock$1283026015 must be defined in the same package as MyInterface/package
  at net.bytebuddy.dynamic.loading.ClassInjector$UsingLookup.injectRaw(ClassInjector.java:1372)
  at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:93)
  at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$UsingLookup.load(ClassLoadingStrategy.java:451)
  at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:85)
  at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5468)
  at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:129)
  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:137)
  at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:350)
  at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:159)
  at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:361)
  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:69)
  at org.mockito.Mockito.mock(Mockito.java:1895)
  ... 52 more

cluelessuk.MyInterfaceTest > client registers with the first available rendezvous node for a given recipient FAILED
    org.mockito.exceptions.base.MockitoException at SomeTest .kt:127
        Caused by: java.lang.IllegalArgumentException at SomeTest.kt:127
1 test completed, 1 failed
FAILURE: Build failed with an exception.

I'm using org.mockito.kotlin:mockito-kotlin:2.2.10 and my interface is indeed in the same package as the test. I have also tried inline mockmaker

bohsen commented 3 years ago

@CluEleSsUK Could you post the test also?

CluEleSsUK commented 3 years ago

Sorry, I ended up switching things to mockK, so no longer have the test - it was fairly mickey mouse though! Something to the effect of:

val mock = mock(MyInterface::class)
val objectUnderTest = Thing(mock)
given(mock.someFn(any()).thenReturn("1234")
val result = objectUnderTest.start()
assertTrue(result)

Some things I tried:

Sorry I can't provide you any more info! Feel free to close if you think there's nothing more that can be done