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

为什么Kotlin命名伴生对象在JUnit测试中未被判定为私有字段?

Kotlin命名伴生对象触发测试失败的原因

Kotlin编译为JVM字节码时,会为伴生对象在宿主类中生成一个对应类型的public static final字段,字段命名遵循以下规则:

  • 未自定义名称的伴生对象,对应字段默认命名为Companion
  • 自定义名称的伴生对象,对应字段直接使用用户设置的自定义名称

你所用的JUnit测试用例中,仅对名为Companion的字段做了非私有豁免,你给伴生对象命名为Parser后,编译器生成的对应字段名为Parser,不在豁免列表中,且该字段的修饰符为public,因此被判定为不符合要求的非私有字段。

伴生对象对应字段为public的原因

伴生对象的设计目标就是允许外部直接访问其成员:

  • 未命名伴生对象可通过宿主类.Companion.成员名调用
  • 命名伴生对象可通过宿主类.自定义伴生对象名.成员名调用
    如果该静态字段被设置为private,外部将无法直接获取伴生对象实例,也就无法调用其未加@JvmStatic注解的成员,因此Kotlin编译器默认将伴生对象对应的静态字段设为public修饰。

解决方案

  • 直接删除伴生对象的自定义名称,使用默认无命名伴生对象,生成的字段会自动匹配测试的豁免规则,即可正常通过测试
  • 可向授课老师反馈测试用例的逻辑漏洞:该测试不应硬编码匹配Companion字段名,应当通过字段类型判断是否为伴生对象生成的字段,再做对应豁免处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:24:03