Kotlin:测试中的java.lang.NoSuchMethodError
是否可以在不同的源代码集中使用Kotlin包函数和包的属性? 当我尝试这样做,我有NoSuchMethodError
抛出。
例
我有Graft项目,包含Kotlin代码和两个源代码集, main
和test
。 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 abc") } ... }
正好在有效payloadSplitter
的第一行,在运行时我得到了
java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String;
其他全局变量和函数在test
中也是不可访问的。
UPD Kotlin团队解释了这个问题,并在这里宣布了修复。
对于类之外的属性和方法,Kotlin创建一个名为$ {packagename} Package的java类,其中的属性和方法被实现为静态方法和变量。 使用多个源代码集,java类将创建两次,每个源代码集一次。 你的问题是测试源集“包类”隐藏了在主源集中编译的类。
正如在上面的注释中提到的,避免在测试源集中有任何顶级属性或方法来阻止Kotlin编译器在测试输出目录中创建这个包类。
除了之前的建议之外,我还发现了另一个解决方法:如果您需要在test
需要包级函数或属性,请将测试移至不同的包,例如在测试源中:
package ru.ifmo.ctddev.igushkin.dkvs.tests
然后呢
import ru.ifmo.ctddev.igushkin.dkvs.*
这是从你的主要包装的一切。 这将使Kotlin compliler生成两个无冲突的Package类,因此两者都可以拥有全局成员。