Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试包不读取主包中定义的Kotlin类_Java_Android_Gradle_Kotlin - Fatal编程技术网

Java 测试包不读取主包中定义的Kotlin类

Java 测试包不读取主包中定义的Kotlin类,java,android,gradle,kotlin,Java,Android,Gradle,Kotlin,我似乎无法访问Android Studio项目中Kotlin模块测试包中的主类。请注意,下面显示的所有代码都在导入Android应用程序的Kotlin JVM模块中 这是我的src/main/java代码: import com.google.gson.annotations.SerializedName data class Customer(val password1: String, val password2: String,

我似乎无法访问Android Studio项目中Kotlin模块测试包中的主类。请注意,下面显示的所有代码都在导入Android应用程序的Kotlin JVM模块中

这是我的
src/main/java
代码:

import com.google.gson.annotations.SerializedName

data class Customer(val password1: String,
                val password2: String,
                @SerializedName("last_name") val lastName: String,
                @SerializedName("first_name") val firstName: String,
                val email: String)
我在
src/test/java
中的测试代码:

class CreateUser {

    @Test
    fun createRandomUser() {
        val random = Random()
        val randomNumber = random.nextInt(10000000)
        val customer = Customer("password", "password", "lastName", "firstName", "ted$randomNumber@gmail.com")

    }
}
我的
build.gradle
代码如下所示:

buildscript {
    ext.kotlin_version = '1.1.4-3'
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.7.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'kotlin'

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    // some other compile dependencies
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

    testCompile "org.hamcrest:hamcrest-all:1.3"
    testCompile 'junit:junit:4.11'
    testCompile 'org.mockito:mockito-all:1.9.5'
    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit"
}

task javadocJar(type: Jar) {
    classifier = 'javadoc'
    from javadoc
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

artifacts {
    archives sourcesJar
    archives javadocJar
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.6"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.6"
    }
}
build.gradle
文件如下所示:

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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

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

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
            credentials { username authToken }
        }
    }
}

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

ext {
    versionName = "0.1.1"
    rxJavaVersion = "2.1.3"
    okHttpVersion = "3.9.0"
    retrofitVersion = "2.3.0"
    rxJava2AdapterVersion = "1.0.0"
    googleGsonVersion = "2.8.0"
}

我得到的错误是gradle无法在测试类中解析
Customer
未解析的引用:Customer
)。它似乎没有将主类包含到测试源目录中。但是,它在IDE中解析。

好的,我已经找到了解决方案。似乎我必须在build.gradle中明确指定src文件夹,并将所有Kotlin代码分别放在
src/main/Kotlin
src/test/Kotlin

sourceSets {
    main.kotlin.srcDirs = ['src/main/kotlin', 'src/main/java']
    main.java.srcDirs = []
    test.kotlin.srcDirs = ['src/test/kotlin', 'src/test/java']
    test.java.srcDirs = ['src/test/kotlin', 'src/test/java']
}

一旦我这样做了,测试就开始按预期工作了——甚至在Jenkins上生成了报告,这很好。

为什么不分别在
src/main/kotlin
src/test/kotlin
中定义它呢?这会有区别吗@从格拉德尔的角度来看,可能是这样。Gradle使用java编译器编译java文件,使用kotlin编译器编译kotlin文件。如果kotlin文件放错了位置,它们可能不会被选中进行编译,因此找不到。不幸的是,这没有解决问题。请查看正在运行的演示:此答案生成:“无法获取com.android.build.gradle.internal.api.DefaultAndroidSourceSet类型的源集main的未知属性'kotlin'是的,这似乎是添加其他JVM语言的一个关键点。如果您将Scala添加到这个项目中,您也会做同样的事情:Scala.srcDirs=['src/main/Scala','src/main/java']需要注意的一件事——一旦您理清了gradle构建依赖项,请确保并检查您是否真正导入了有问题的类!这让我烦恼了好几分钟。kotlinlang上的文档支持这种方法:“默认约定使用不同的文件夹…如果不使用默认约定,则应更新相应的SourceSet属性”