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

Kotlin MockK模拟静态方法失效:实际方法被执行

在Kotlin中用MockK正确模拟静态/伴生对象方法

问题根源

你的问题出在Kotlin伴生对象方法和JVM真正静态方法的区别上:

  • 如果伴生对象的方法没加@JvmStatic注解,它本质是StaticClass.Companion这个单例实例的成员方法,不是JVM层面的静态方法。
  • 这时候用mockkStatic(StaticClass::class)根本拦不住,调用StaticClass.testStaticMethod()时自然会执行原方法。

解决办法

根据你的代码情况,分两种场景处理:

场景1:伴生对象方法加了@JvmStatic

要是你打开了代码里的@JvmStatic注释,这就是标准的JVM静态方法,按下面的方式模拟:

class Test {
    @Before
    fun setup() {
        // 可以模拟整个类的静态方法,也可以只指定单个方法
        mockkStatic(StaticClass::class)
        // 或者写 mockkStatic(StaticClass::testStaticMethod)
        
        // 定义模拟逻辑,这一步不会触发原方法执行
        every { StaticClass.testStaticMethod() } returns Unit
    }

    @After
    fun teardown() {
        // 必须清理模拟,不然会影响其他测试用例
        unmockkStatic(StaticClass::class)
    }
}

场景2:伴生对象方法没加@JvmStatic

如果没加@JvmStatic,就得直接模拟伴生对象的实例:

class Test {
    @Before
    fun setup() {
        // 模拟伴生对象实例
        mockkObject(StaticClass.Companion)
        
        // 定义模拟逻辑
        every { StaticClass.testStaticMethod() } returns Unit
    }

    @After
    fun teardown() {
        // 清理模拟
        unmockkObject(StaticClass.Companion)
    }
}

重要提醒

  • 别乱用API:针对不同类型的方法选对应的mockkStatic或mockkObject,混用会导致模拟失效。
  • 一定要清理模拟:测试结束后用unmockkStatic或unmockkObject清空,避免测试用例之间互相干扰。
  • 确认MockK版本:用1.13.8及以上版本,确保兼容JDK17,避免不必要的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:37