Mockito mock Kotlin Object类方法报错该如何解决
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天就跟大家聊聊有关Mockito mock Kotlin Object类方法报错该如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。比如
千家信息网最后更新 2026年11月02日Mockito mock Kotlin Object类方法报错该如何解决
今天就跟大家聊聊有关Mockito mock Kotlin Object类方法报错该如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
比如我创建一个Kotlin Object类:ObjectMethod
package com.baichuan.example.unit_testobject ObjectMethod { fun doSomething() { println("this is ObjectMethod#doSomething") } @JvmStatic fun doSomethingWithJvmStatic() { println("this is ObjectMethod#doSomethingWithJvmStatic") }}如果我直接去mock该类的doSomething方法,会报错。
@Test @DisplayName("mock普通的kotlin静态方法") fun testMockKotlinObject() { Assertions.assertThrows(MissingMethodInvocationException::class.java) { Mockito.mockStatic(ObjectMethod::class.java).`when`( ObjectMethod::doSomething ).thenAnswer { println("this is mocked Object#doSomething") } } ObjectMethod.doSomething() } 这是因为kotlin里的object类里的方法虽然在kotlin里从形态跟使用上来看与静态方法无二。但是编译成java代码后,其本质其实是内部初始化了一个当前类的静态常量实例INSTANCE。这个INSTANCE在kotlin语法里被隐藏了,但在java里依然可以显示访问。ObjectMethod编译成java后的代码如下:
public final class ObjectMethod { @NotNull public static final ObjectMethod INSTANCE = new ObjectMethod(); private ObjectMethod() { } public final void doSomething() { String var1 = "this is ObjectMethod#doSomething"; boolean var2 = false; System.out.println(var1); } @JvmStatic public static final void doSomethingWithJvmStatic() { String var0 = "this is ObjectMethod#doSomethingWithJvmStatic"; boolean var1 = false; System.out.println(var0); }}所以,不能mock ObjectMethod#doSomething本质上的原因是正常手段无法mock静态常量。如果想要使kotlin的object类中的方法能够被mock,只需在方法上加上@JvmStatic注解即可。被其标注的方法会被编译成普通的java静态方法。
上面说正常手段无法mock静态常量,那么非正常手段呢?其实这个非正常手段就是通过反射将被mock过的实例注入到ObjectMethod中即可。
@Test @DisplayName("通过反射修改静态常量来mock普通的kotlin静态方法") fun testMockKotlinObjectMethodByReflection() { val mock = Mockito.mock(ObjectMethod::class.java) Mockito.`when`(mock.doSomething()).then { print("this is mocked ObjectMethod by reflection") } val declaredMethod = ObjectMethod::class.java.getDeclaredField("INSTANCE") ReflectionUtils.setFinalStatic(declaredMethod, mock) ObjectMethod.doSomething() }ReflectionUtils
package com.baichuan.example.unit_testimport java.lang.reflect.Fieldimport java.lang.reflect.Modifierobject ReflectionUtils { @Throws(Exception::class) fun setFinalStatic(field: Field, newValue: Any) { field.isAccessible = trueval modifiersField: Field = Field::class.java.getDeclaredField("modifiers") modifiersField.isAccessible = true modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv()) field.set(null, newValue) }}看完上述内容,你们对Mockito mock Kotlin Object类方法报错该如何解决有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
方法
静态
常量
手段
普通
内容
编译
代码
实例
本质
反射
原因
只需
就是
形态
更多
注解
知识
篇文章
行业
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技网
美国互联网科技巨头监管
港股互联网科技股
中正互联网科技招聘
上海电发互联网科技有限公司
江苏南京365互联网科技
哈尔滨新华互联网科技学院
北京大学互联网科技怎么样
福建科技产业互联网发展
浙江互联网科技研学营
语蝶互联网科技有限公司
乌鲁木齐新华智原互联网科技学校
四川慕妮娅互联网科技有限公司
2021互联网科技公司排名
互联网企业科技类企业如何做账
启辰互联网科技
全球科技与互联网公司市值变化
好易买互联网科技
三亚科技创新互联网基地
杭州科技互联网公司有哪些
深圳九邦互联网科技有限公司
互联网科技行业发展
互联网科技未来
互联网科技公司怎么样
郑州华宇互联网科技
互联网金融科技公司干啥的
苏州五指互联网络科技有限
天津腾达互联网科技有限公司
佛山市拉法互联网科技有限公司
互联网第三次科技革命特征