如何在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
相关产品推荐
相关产品推荐

