Kotlin:测试中的java.lang.NoSuchMethodError

热键

是否可以在不同的源集中使用Kotlin软件包功能和软件包属性?当我尝试这样做时,我就NoSuchMethodError抛出了。


我有科特林代码摇篮项目,并在两份sourcesets,maintest在中main,文件之一中包含以下代码:

package ru.ifmo.ctddev.igushkin.dkvs
...
public val payloadSplitter: String = " ### "

test我尝试使用payloadSplitter以下代码进行访问

package ru.ifmo.ctddev.igushkin.dkvs
...
public class MessageTests {
    ...
    test fun testParsing() {
        ...
        checkParseAndToString("p1b 345 ${payloadSplitter} set a b c")
    }
    ...
}

恰好在payloadSplitter访问的第一行,在运行时

java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String;

其他全局变量和函数也同样无法访问test


UPD Kotlin团队对此问题进行了解释,并在此处宣布了解决方法

特拉维斯

对于类之外的属性和方法,Kotlin创建一个名为$ {packagename} Package的Java类,其属性和方法实现为静态方法和变量。对于多个源集,java类将创建两次,每个源集一次。您的问题是测试源集“包类”隐藏了在主源集中编译的类。

如以上注释中所述,请避免在测试源集中包含任何顶级属性或方法,以防止Kotlin编译器在测试输出目录中创建此包类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章