为什么Kotlin命名伴生对象在JUnit测试中未被判定为私有字段?
Kotlin命名伴生对象触发测试失败的原因
Kotlin编译为JVM字节码时,会为伴生对象在宿主类中生成一个对应类型的public static final字段,字段命名遵循以下规则:
- 未自定义名称的伴生对象,对应字段默认命名为
Companion - 自定义名称的伴生对象,对应字段直接使用用户设置的自定义名称
你所用的JUnit测试用例中,仅对名为Companion的字段做了非私有豁免,你给伴生对象命名为Parser后,编译器生成的对应字段名为Parser,不在豁免列表中,且该字段的修饰符为public,因此被判定为不符合要求的非私有字段。
伴生对象对应字段为public的原因
伴生对象的设计目标就是允许外部直接访问其成员:
- 未命名伴生对象可通过
宿主类.Companion.成员名调用 - 命名伴生对象可通过
宿主类.自定义伴生对象名.成员名调用
如果该静态字段被设置为private,外部将无法直接获取伴生对象实例,也就无法调用其未加@JvmStatic注解的成员,因此Kotlin编译器默认将伴生对象对应的静态字段设为public修饰。
解决方案
- 直接删除伴生对象的自定义名称,使用默认无命名伴生对象,生成的字段会自动匹配测试的豁免规则,即可正常通过测试
- 可向授课老师反馈测试用例的逻辑漏洞:该测试不应硬编码匹配
Companion字段名,应当通过字段类型判断是否为伴生对象生成的字段,再做对应豁免处理。
内容的提问来源于stack exchange,提问作者Fabs
相关产品推荐
相关产品推荐

