当前位置: 首页 > 面试题库 >

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

李文轩
2023-03-14
问题内容

更新

已针对此问题提交了一个错误:https :
//youtrack.jetbrains.com/issue/KT-17951

更新2

该错误已在Android Studio 3.0 Canary 3中修复

原始帖子

我刚刚开始使用Android Studio 3.0,从一开始就启用了kotlin支持。我在项目中编写了一个非常简单的Kotlin类:

data class Wallet(val coins: Int) {
    fun add(value: Int): Wallet = Wallet(coins + value)
    fun substract(value: Int): Wallet = if (coins > value) Wallet(coins + value) else throw InsufficientFundsException()
}

现在我想测试该类,首先我在Kotlin中编写了一个本地运行的unittest(测试目录):

class WalletTestKotlin {

    @Throws(Exception::class)
    @Test
    fun add() {
        Assert.assertEquals(22, Wallet(20).add(2).coins.toLong())
        Assert.assertNotEquals(5, Wallet(2).add(13).coins.toLong())
    }
}

它编译并运行,但显示错误消息:

找不到类:“ com.agentknopf.hachi.repository.model.WalletTestKotlin”空测试套件。

因此,我重新编写了Java中的测试:

public class WalletTest {

    @Throws(exceptionClasses = Exception.class)
    @Test
    public void add() {
        Assert.assertEquals(22, new Wallet(20).add(2).getCoins());
        Assert.assertNotEquals(5, new Wallet(2).add(13).getCoins());
    }
}

但是该测试也失败了-这次找不到Kotlin类“钱包”:

java.lang.NoClassDefFoundError:com / example / repository / model / Wallet

我想知道我是否缺少某些东西…运行Java测试,该测试不引用Kotlin类,但是仅成功完成Java类。

我的项目build.gradle文件是默认文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.1.2-4'
    repositories {
        maven { url 'https://maven.google.com' }
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

我特定于模块的build.gradle的依赖项:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //Kotlin support
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    //Testing libraries
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    testCompile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
}

问题答案:

解决方法(目前):

将其放入您的(应用程序级)build.gradle:

task copyTestClasses(type: Copy) {
    from "build/tmp/kotlin-classes/debugUnitTest"
    into "build/intermediates/classes/debug"
}

然后在“启动之前”自下而下修改测试JUnit Run / Debug配置,在其中有“ Gradle-aware
make”,+另一部分,选择gradle task,选择build.gradle它所在的项目文件,然后键入copyTestClasses。单击此处获取不同测试框架的屏幕截图,但是管道的工作原理相同。

您可能需要更改/添加更多目录管道,具体取决于您的构建类型。查找那些奇怪位置的方法是通过在项目树中粗略搜索相关的.class文件。



 类似资料:
  • 我用Mockito进行了Java测试: Kotlin.TypeCastException:null不能强制转换为非null类型java.util.HashMap 如何正确模拟属性?

  • 所以在用kotlin类做了大量的试验和错误之后,我发现同样的代码在java中是可测试的,但在kotlin中是不可测试的。 这会导致:org . mock ITO . exceptions . mis using . missingmethodinvocationexception:when()需要一个必须是“模拟上的方法调用”的参数。比如:when(mock.getArticles())。然后返回

  • 我已经看了所有其他对此的反应,但它们似乎不适用于我。 https://kotlinlang.org/api/latest/kotlin.test/kotlin.test/ 我正在尝试从暂存文件或.kt文件访问它,并且它不在下拉列表中以选择它。 项目正在使用JDK 15。

  • 我有一个与Kotlin的Gradle项目,有3个源代码文件夹(main,test,integration)。我想为单元和集成测试设置不同的分级测试任务。测试和集成文件夹的用途。我尝试了几种解决方案来设置集成测试任务,但到目前为止都没有工作。到处都提到我需要为集成创建一个不同的源集,添加一些配置以便能够正确地编译该文件夹中的代码,并设置任务本身。都做完了,但当我做测试的时候,他们失败了。然后,报告说

  • 编辑:供未来读者使用。我不知道这个问题是否对你有很大的帮助。有趣的逻辑已经发生了很大的变化,所以我关闭了这个问题,但不会删除它。 我正在尝试为我的ViewModel编写一些单元测试。我正在使用Mockk和junit5。 应该发生的事情:模拟存储库返回fakeresponse(我称之为VM中的乐趣),它将livedata设置为假响应数据。 实际发生的情况: 这就是考验 这是测试中延长的两个类 这是苏