You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mockk中正确Mock返回密封类的函数?

解决MockK Mock返回密封类函数时的崩溃问题

当使用MockK对返回密封类的函数进行存根时,若写法不当会触发java.lang.UnsupportedOperationException错误,报错信息提示类重定义失败,无法修改NestHost、PermittedSubclasses等类属性。

问题代码示例

package nl.dstibbe.example

import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Test

sealed class MySeal
data class MyOtherSeal(val value: String) : MySeal()

class MyClass {
    fun someMethod(b: String): MySeal {
        return MyOtherSeal("hooray")
    }
}

class SealTest {
    val mockedClass: MyClass = mockk()

    @Test
    fun `test me`() {
        every { mockedClass.someMethod(any()) } returns MyOtherSeal("something else")   // 执行失败
    }
}

解决方案

问题根源在于any()的自动类型推断逻辑:MockK在录制存根时,会尝试为函数的返回类型(密封类MySeal)生成临时Mock实例,但密封类的PermittedSubclasses属性限制了动态子类的创建,导致类重定义失败。

只需明确指定any()的参数类型,即可避免MockK尝试实例化密封类的临时Mock:

@Test
fun `test me`() {
    every { mockedClass.someMethod(any<String>()) } returns MyOtherSeal("something else")
}

也可以使用具体的参数匹配器替代any(),比如eq("test"),同样能解决问题。

内容的提问来源于stack exchange,提问作者dstibbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:35:31