Kotlin:测试中的java.lang.NoSuchMethodError

是否可以在不同的源代码集中使用Kotlin包函数和包的属性? 当我尝试这样做,我有NoSuchMethodError抛出。


我有Graft项目,包含Kotlin代码和两个源代码集, maintestmain ,我有一个文件中的以下代码:

 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类,因此两者都可以拥有全局成员。

Interesting Posts