【问题标题】:Kotlin: java.lang.NoSuchMethodError in testsKotlin:测试中的 java.lang.NoSuchMethodError
【发布时间】:2015-05-25 21:03:00
【问题描述】:

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


示例

我有一个带有 Kotlin 代码的 Gradle 项目和两个源集,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 团队解释了这个问题并宣布了修复here

【问题讨论】:

  • 在测试中是否有 ru.ifmo.ctddev.igushkin.dkvs 包中的任何顶级函数/属性?
  • 如何运行测试?你能发布你的gradle配置吗?看起来测试包是针对主包编译的,但在没有它的情况下运行。
  • @SalomonBRYS, github.com/h0tk3y/dkvs/blob/master/build.gradle -- 在这里。
  • @NataliaUkhorskaya,是的。我有一个顶级财产。稍后我会尝试将其删除。
  • @hotkey 你如何运行测试?通过编辑器还是通过命令行?如果是后者,哪个命令?

标签: gradle nosuchmethoderror kotlin source-sets


【解决方案1】:

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

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

【讨论】:

  • 谢谢。您所说的还有一个解决方法,我将其发布为另一个答案。
  • 此解决方案的另一个附注;至少在 Gradle 中,你需要运行一个干净的构建,否则测试运行器仍然会找到生成的 Package 类。
【解决方案2】:

除了前面的建议之外,我还发现了另一种解决方法:如果您需要 test 中的包级函数或属性,只需将测试移至不同的包,例如在您的测试来源中:

 package ru.ifmo.ctddev.igushkin.dkvs.tests

然后做

 import ru.ifmo.ctddev.igushkin.dkvs.*

这是您主包中的所有内容。这将使 Kotlin 编译器生成两个不冲突的 Package 类,因此它们都可以具有全局成员。

【讨论】:

    【解决方案3】:

    我在测试 kotlin-native 模块时遇到了类似的问题,通过添加此依赖项已解决:

    testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
    testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 2020-09-10
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2020-09-02
      • 1970-01-01
      相关资源
      最近更新 更多