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

