diff --git a/modules/mockk-agent-api/src/commonMain/kotlin/io/mockk/proxy/MockKInstantiatior.kt b/modules/mockk-agent-api/src/commonMain/kotlin/io/mockk/proxy/MockKInstantiatior.kt index d82fb7022..5bc698cba 100644 --- a/modules/mockk-agent-api/src/commonMain/kotlin/io/mockk/proxy/MockKInstantiatior.kt +++ b/modules/mockk-agent-api/src/commonMain/kotlin/io/mockk/proxy/MockKInstantiatior.kt @@ -1,5 +1,5 @@ package io.mockk.proxy interface MockKInstantiatior { - fun instance(cls: Class): T + fun instance(cls: Class): T } diff --git a/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/ObjenesisInstantiator.kt b/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/ObjenesisInstantiator.kt index ce809c546..e040750af 100644 --- a/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/ObjenesisInstantiator.kt +++ b/modules/mockk-agent/src/jvmMain/kotlin/io/mockk/proxy/jvm/ObjenesisInstantiator.kt @@ -20,11 +20,16 @@ class ObjenesisInstantiator( private val instantiators = Collections.synchronizedMap(WeakHashMap, ObjectInstantiator<*>>()) - override fun instance(cls: Class): T { - if (cls == Any::class.java) { + override fun instance(cls: Class): T { + val kcls = cls.kotlin + if (kcls == Any::class) { @Suppress("UNCHECKED_CAST") return Any() as T - } else if (!Modifier.isFinal(cls.modifiers)) { + } else if (kcls.isSealed) { + kcls.sealedSubclasses.firstNotNullOfOrNull { subCls -> + runCatching { instance(subCls.java) }.getOrNull() + } ?: error("could not find subclass for sealed class $cls") + } else if (kcls.isFinal) { try { val instance = instantiateViaProxy(cls) if (instance != null) { diff --git a/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedClassTest.kt b/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedClassTest.kt index f48c8b1f4..efa39cab2 100644 --- a/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedClassTest.kt +++ b/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedClassTest.kt @@ -2,7 +2,6 @@ package io.mockk.it import io.mockk.every import io.mockk.mockk -import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals @@ -10,7 +9,6 @@ import kotlin.test.assertEquals class SealedClassTest { @Test - @Ignore("Fails on JDK17+ https://github.com/mockk/mockk/issues/832") fun serviceReturnsSealedClassImpl() { val factory = mockk { every { create() } returns Leaf(1) @@ -22,7 +20,6 @@ class SealedClassTest { } @Test - @Ignore("Fails on JDK17+ https://github.com/mockk/mockk/issues/832") fun serviceAnswersSealedClassImpl() { val factory = mockk { every { create() } answers { Leaf(1) } diff --git a/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedInterfaceTest.kt b/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedInterfaceTest.kt index 4abe70221..91f727abf 100644 --- a/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedInterfaceTest.kt +++ b/modules/mockk/src/commonTest/kotlin/io/mockk/it/SealedInterfaceTest.kt @@ -3,14 +3,12 @@ package io.mockk.it import io.mockk.every import io.mockk.mockk import kotlin.test.Test -import kotlin.test.Ignore import kotlin.test.assertEquals class SealedInterfaceTest { @Test - @Ignore("Fails on JDK17+ https://github.com/mockk/mockk/issues/832") fun serviceReturnsSealedClassImpl() { val factory = mockk { every { create() } returns Leaf(1) @@ -22,7 +20,6 @@ class SealedInterfaceTest { } @Test - @Ignore("Fails on JDK17+ https://github.com/mockk/mockk/issues/832") fun serviceAnswersSealedClassImpl() { val factory = mockk { every { create() } answers { Leaf(1) }