Kotlin 类的 Android 单元测试因“找不到符号类...”而失败

Posted

技术标签:

【中文标题】Kotlin 类的 Android 单元测试因“找不到符号类...”而失败【英文标题】:Android Unit Test of Kotlin class fails with "cannot find symbol class ..." 【发布时间】:2014-12-08 01:03:00 【问题描述】:

我最近将 Kotlin 插件添加到我的 android 应用程序的构建中,现在我想在 InstrumentationTestCase 中测试 Kotlin 类。

IntelliJ/Android Studio 在编辑器中看到该类,并且该类似乎在启动应用程序时已编译,但当我启动 gradlew assembleTest 时它失败并显示“找不到符号 [类名称]”。

在我的 build.gradle 中,我将 kotlin 文件夹添加为 srcDir

sourceSets 
    main 
        manifest.srcFile 'src/main/AndroidManifest.xml'
        java.srcDirs += 'src/main/kotlin'
    

有什么建议吗?

编辑:问题是 Kotlin 和 Retrolambda 插件之间的冲突,现已解决。

【问题讨论】:

您能否用有关您的分辨率的注释来更新问题,您在另一条评论中说“问题似乎是我正在使用的 gradle-retrolambda 插件的旧版本”,但人们不应该有阅读所有 cmets 以了解问题的状态;因为它也不是答案的一部分。 【参考方案1】:

我来自 Kotlin 项目。你能回答几个问题来帮助我重现你的问题吗? 您是从 IDE 还是从命令行运行 gradlew assembleTest?依赖项中有 kotlin-stdlib 吗?

dependencies 
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

您能向我们提供您的项目吗?我在你的跟踪器中创建了一个问题,所以很高兴在这里看到你的答案http://youtrack.jetbrains.com/issue/KT-6015

【讨论】:

娜塔莉亚,谢谢你的回答。我在groups.google.com/forum/#!topic/adt-dev/LvlkgNlTvtA 提供了更多信息,我还指出了一种解决方法。我的项目相当大,所以我将尝试获取一个最小的工作示例并将其发布在此处和错误跟踪器上。 回答另一个问题,是的,我在依赖项中有 std-lib。 哦,看来问题是出于兼容性原因我正在使用的 gradle-retrolambda 插件的旧版本。很抱歉给您带来麻烦。 我遇到了同样的问题(而且我不使用 gradle-retrolambda)。我确实在依赖项中有stdlib。 Kotlin 代码作为这样的构建,工作(我的意思是应用程序运行),我只能运行基于 InstrumentationCase 的测试套件。我正在使用 Android Studio 运行我的单元测试。 确切地说,我收到了NoClassDefFoundError 异常。如果您有兴趣,我可以向您提供我的项目 - 这只是爱好代码,我对 Kotlin 感兴趣,所以我正在尝试。但不幸的是,无法进行单元测试将是一个阻碍......【参考方案2】:

虽然在另一个答案中正在调查该问题,但这里有一个临时解决方法。将此添加到您的 build.gradle:

afterEvaluate  project ->
    project.tasks.findAll 
        it.name.startsWith('compile') && it.name.endsWith('DebugTestJava')
    .each  Task task ->
        task.dependsOn copyKotlinToTest
    


task copyKotlinToTest(type: Copy) 
    from new File(buildDir, 'tmp/kotlin-classes/debug')
    into new File(buildDir, 'tmp/kotlin-classes/debugTest')

如果您有构建变体,则需要调整文件夹的名称。

【讨论】:

没有帮助,很遗憾。

以上是关于Kotlin 类的 Android 单元测试因“找不到符号类...”而失败的主要内容,如果未能解决你的问题,请参考以下文章

模拟单元测试和 UI 测试的最终类

在Android上Kotlin的单元测试(KAD22)

Android Studio 3.0 Canary 1:引用 Kotlin 类的 Kotlin 测试或 Java 测试失败

dagger2 和 kotlin 的 Android 单元测试问题

Android 仪器化单元测试(instrumented unit tests) Androidx kotlin版本

Kotlin-multiplatform:如何执行 iOS 单元测试