'mocck.spyk on a interface object failing
when spy on a interface object, it got
WARNING: Failed to transform class com/module/EvntHandleTest$test_evtListener$1$listener$1
java.lang.IncompatibleClassChangeError:
the class:
///
open class TestClass(internal var mListener: EventListener?) {
fun interface EventListener {
fun onEvent(eventType: String, data: String): Boolean;
}
fun doSomething(eventType: String, data: String) {
callListener(eventType, data)
}
internal fun callListener(eventType: String, data: String): Boolean {
mListener?.let {
return it.onEvent(eventType, data)
}
return false
}
}
///
// test
@RunWith(AndroidJUnit4::class)
class EvntHandleTest {
@Test
fun test_evtListener() {
io.mockk.mockkStatic(android.util.Log::class) {
var listenerCalled = true
val listener = object : TestClass.EventListener {
override fun onEvent(eventType: String, data: String): Boolean {
android.util.Log.i("EventListener", eventType)
listenerCalled = false
return listenerCalled
.also {
System.out.println("+++ +++ onEvent($eventType: String, $data: Any)")
}
}
}
val listenerSpy = io.mockk.spyk(listener) //<== this line got the warning
val testClass = TestClass(listenerSpy)
testClass.doSomething("theType", "eee888")
// comment out this verify it will pass (but the warning still exist)
io.mockk.verify(exactly = 1) {
listenerSpy.onEvent(any(), any())
}
io.mockk.verify(exactly = 1) {
Log.i(eq("EventListener"), eq("theType"))
}
assert(!listenerCalled)
}
}
}
test output:
[Robolectric] com.module.EvntHandleTest.test_evtListener: sdk=28; resources=BINARY
Called loadFromPath(/system/framework/framework-res.apk, true); mode=binary sdk=28
Mar 16, 2022 10:34:07 AM io.mockk.impl.log.JULLogger warn
WARNING: Failed to transform class com/module/EvntHandleTest$test_evtListener$1$listener$1
java.lang.IncompatibleClassChangeError: com.module.aEvntHandleTest and com.module.EvntHandleTest$test_evtListener$1$listener$1 disagree on InnerClasses attribute
at java.lang.Class.getDeclaringClass0(Native Method)
at java.lang.Class.getDeclaringClass(Class.java:1235)
at net.bytebuddy.description.type.TypeDescription$Generic$OfNonGenericType$ForLoadedType.getOwnerType(TypeDescription.java:3981)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor$ForDetachment.onSimpleType(TypeDescription.java:2059)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor.onNonGenericType(TypeDescription.java:1880)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor$ForDetachment.onNonGenericType(TypeDescription.java:2022)
at net.bytebuddy.description.type.TypeDescription$Generic$OfNonGenericType.accept(TypeDescription.java:3783)
at net.bytebuddy.description.method.MethodDescription$AbstractBase.asToken(MethodDescription.java:807)
at net.bytebuddy.description.method.MethodDescription$AbstractBase.asToken(MethodDescription.java:373)
at net.bytebuddy.description.method.MethodList$AbstractBase.asTokenList(MethodList.java:87)
at net.bytebuddy.dynamic.scaffold.InstrumentedType$Factory$Default$1.represent(InstrumentedType.java:415)
at net.bytebuddy.ByteBuddy.redefine(ByteBuddy.java:782)
at net.bytebuddy.ByteBuddy.redefine(ByteBuddy.java:757)
at io.mockk.proxy.jvm.transformation.InliningClassTransformer.transform(InliningClassTransformer.kt:71)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
at io.mockk.proxy.jvm.transformation.JvmInlineInstrumentation.retransform(JvmInlineInstrumentation.kt:28)
at io.mockk.proxy.common.transformation.RetransformInlineInstrumnetation$execute$1.invoke(RetransformInlineInstrumnetation.kt:19)
at io.mockk.proxy.common.transformation.RetransformInlineInstrumnetation$execute$1.invoke(RetransformInlineInstrumnetation.kt:6)
at io.mockk.proxy.common.transformation.ClassTransformationSpecMap.applyTransformation(ClassTransformationSpecMap.kt:41)
at io.mockk.proxy.common.transformation.RetransformInlineInstrumnetation.execute(RetransformInlineInstrumnetation.kt:16)
at io.mockk.proxy.jvm.ProxyMaker.inline(ProxyMaker.kt:88)
at io.mockk.proxy.jvm.ProxyMaker.proxy(ProxyMaker.kt:30)
at io.mockk.impl.instantiation.JvmMockFactory.newProxy(JvmMockFactory.kt:34)
at io.mockk.impl.instantiation.AbstractMockFactory.newProxy$default(AbstractMockFactory.kt:29)
at io.mockk.impl.instantiation.AbstractMockFactory.spyk(AbstractMockFactory.kt:102)
at com.module.EvntHandleTest.test_evtListener(PsaEvntHandleTest.kt:211)
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:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
+++ +++ onEvent(theType: String, eee888: Any)
+++ +++ onEvent(-3089f9b3d46541dd: String, 58cb97533a779e3d: Any)
io.mockk.MockKException: Failed matching mocking signature for
SignedCall(retValue=0, isRetValueMock=false, retType=class kotlin.Int, self=class android.util.Log, method=i(String, String), args=[EventListener, -3089f9b3d46541dd], invocationStr=class android.util.Log.i(EventListener, -3089f9b3d46541dd))
left matchers: [any()]
at io.mockk.impl.recording.SignatureMatcherDetector.detect(SignatureMatcherDetector.kt:99)
at io.mockk.impl.recording.states.RecordingState.signMatchers(RecordingState.kt:39)
at io.mockk.impl.recording.states.RecordingState.round(RecordingState.kt:31)
at io.mockk.impl.recording.CommonCallRecorder.round(CommonCallRecorder.kt:50)
at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:63)
at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
at io.mockk.MockKDsl.internalVerify(API.kt:118)
at io.mockk.MockKKt.verify(MockK.kt:149)
at io.mockk.MockKKt.verify$default(MockK.kt:146)
at com.module.PsaEvntHandleTest.test_evtListener(PsaEvntHandleTest.kt:71)
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:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
having
compilesdk : 30,
targetsdk : 30,
buildtools : '29.0.2',
supportlib : '28.0.0',
robolectric : "4.3.1",
junitVersion : "4.13.2",
mockkVersion : "1.11.0"
using android studio 4.1.2, with JDK JAVA_VERSION="1.8.0_242" for the Gradle
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|