From ba52df1ada9596bf86308c2ad61201c00264555d Mon Sep 17 00:00:00 2001 From: aSemy <897017+aSemy@users.noreply.github.com> Date: Fri, 16 Sep 2022 12:26:59 +0200 Subject: [PATCH 1/3] value class check - catch KotlinReflectionInternalError might fix #868, caused by #913? --- .../src/jvmMain/kotlin/io/mockk/core/ValueClassSupport.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/mockk-core/src/jvmMain/kotlin/io/mockk/core/ValueClassSupport.kt b/modules/mockk-core/src/jvmMain/kotlin/io/mockk/core/ValueClassSupport.kt index 797926d90..a8a52615c 100644 --- a/modules/mockk-core/src/jvmMain/kotlin/io/mockk/core/ValueClassSupport.kt +++ b/modules/mockk-core/src/jvmMain/kotlin/io/mockk/core/ValueClassSupport.kt @@ -6,6 +6,7 @@ import kotlin.reflect.full.declaredMemberProperties import kotlin.reflect.full.primaryConstructor import kotlin.reflect.jvm.isAccessible import kotlin.reflect.jvm.javaField +import kotlin.reflect.jvm.internal.KotlinReflectionInternalError actual object ValueClassSupport { @@ -61,6 +62,8 @@ actual object ValueClassSupport { private val KClass.isValue_safe: Boolean get() = try { this.isValue + } catch (_: KotlinReflectionInternalError) { + false } catch (_: UnsupportedOperationException) { false } From 82441292fbebb3bfc2eae47aef60d1c0d19ca352 Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Fri, 16 Sep 2022 16:48:44 +0200 Subject: [PATCH 2/3] test isValue_safe doesn't throw KotlinReflectionInternalError --- test-modules/client-tests/build.gradle.kts | 4 +++- .../jvmTest/java/io/mockk/core/JavaEnum.java | 10 ++++++++ .../io/mockk/core/ValueClassSupportTest.kt | 24 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test-modules/client-tests/src/jvmTest/java/io/mockk/core/JavaEnum.java create mode 100644 test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt diff --git a/test-modules/client-tests/build.gradle.kts b/test-modules/client-tests/build.gradle.kts index 185cdf2cf..7eccbe1f0 100644 --- a/test-modules/client-tests/build.gradle.kts +++ b/test-modules/client-tests/build.gradle.kts @@ -3,7 +3,9 @@ plugins { } kotlin { - jvm() + jvm { + withJava() + } sourceSets { val commonMain by getting { diff --git a/test-modules/client-tests/src/jvmTest/java/io/mockk/core/JavaEnum.java b/test-modules/client-tests/src/jvmTest/java/io/mockk/core/JavaEnum.java new file mode 100644 index 000000000..7cb13cc56 --- /dev/null +++ b/test-modules/client-tests/src/jvmTest/java/io/mockk/core/JavaEnum.java @@ -0,0 +1,10 @@ +package io.mockk.core; + +/** @see ValueClassSupport */ +public enum JavaEnum { + A { + public String toString() { + return "aaa"; + } + } +} diff --git a/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt new file mode 100644 index 000000000..c6e91983e --- /dev/null +++ b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt @@ -0,0 +1,24 @@ +package io.mockk.core + +import io.mockk.every +import io.mockk.mockk +import kotlin.test.Test + + +class ValueClassSupportTest { + + /** https://github.com/mockk/mockk/issues/868 */ + @Test + fun `verify Java class does not cause KotlinReflectionInternalError`() { + val mock = mockk { + every { func() } returns JavaEnum.A + } + + mock.func() // throws KotlinReflectionInternalError + } + +} + +private class MockTarget { + fun func(): JavaEnum = JavaEnum.A +} From 8bacef40bc4f6cb1fc3f7148c9011dc726563e71 Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Fri, 16 Sep 2022 16:51:22 +0200 Subject: [PATCH 3/3] add assertion to test --- .../jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt index c6e91983e..4826fe852 100644 --- a/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt +++ b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt @@ -3,6 +3,7 @@ package io.mockk.core import io.mockk.every import io.mockk.mockk import kotlin.test.Test +import kotlin.test.assertEquals class ValueClassSupportTest { @@ -14,7 +15,9 @@ class ValueClassSupportTest { every { func() } returns JavaEnum.A } - mock.func() // throws KotlinReflectionInternalError + val result = mock.func() // check this doesn't throw KotlinReflectionInternalError + + assertEquals(JavaEnum.A, result) } }