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 } 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..4826fe852 --- /dev/null +++ b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/core/ValueClassSupportTest.kt @@ -0,0 +1,27 @@ +package io.mockk.core + +import io.mockk.every +import io.mockk.mockk +import kotlin.test.Test +import kotlin.test.assertEquals + + +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 + } + + val result = mock.func() // check this doesn't throw KotlinReflectionInternalError + + assertEquals(JavaEnum.A, result) + } + +} + +private class MockTarget { + fun func(): JavaEnum = JavaEnum.A +}