【问题标题】:Gradle integration test task for Kotlin classesKotlin 类的 Gradle 集成测试任务
【发布时间】:2020-07-22 17:57:53
【问题描述】:

我有一个带有 Kotlin 的 Gradle 项目,其中包含 3 个源文件夹(主文件夹、测试文件夹、集成文件夹)。我想为单元测试和集成测试设置不同的 Gradle 测试任务。那就是那些测试和集成文件夹的用途。我尝试了几种解决方案来设置集成测试任务,但到目前为止没有任何效果。到处都提到我需要创建一个不同的 sourceSet 进行集成,添加一些配置以便能够正确编译该文件夹中的代码并设置任务本身。一切都完成了,但是当我运行测试时,它们失败了。然后报告说 ClassNotFound 基本上是那个(集成)文件夹中的所有内容。 build.gradle 文件和输出结果附在下面

buildscript {
    ext.kotlin_version = '1.3.71'
    ext.ktor_version = '1.3.2'
    ext.exposed_version = '0.22.1'
    ext.kodein_version = '6.5.0'
    ext.postgres_version = '42.2.6'
    ext.stripe_version = '17.16.0'
    ext.junit_version = '5.6.0'
    ext.log4j2_version = '2.13.1'
    ext.aws_sdk_version = '1.11.734'
    ext.html_to_pdf_version = '1.0.0'
    ext.kotlintest_version = '4.0.2'

    repositories {
        maven { url "https://kotlin.bintray.com/kotlinx" }
        maven { url "https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/" }
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "javax.jms:jms:1.1"
    }
}

plugins {
    id("java")
    id 'org.jetbrains.kotlin.jvm' version '1.3.71'
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.3.71'
    id("application")
}

group 'nz.co.redium'

mainClassName = 'nz.co.redium.bookmybusiness.ApplicationKt'

repositories {
    mavenCentral()
    jcenter()
    maven { url "https://dl.bintray.com/kotlin/ktor" }
}

compileKotlin {
    kotlinOptions.jvmTarget = "12"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "12"
}

sourceSets {
    integration {
        java.srcDir "$projectDir/src/integration/kotlin"
        kotlin.srcDir "$projectDir/src/integration/kotlin"
        resources.srcDir "$projectDir/src/integration/resources"
        compileClasspath += main.output + test.output
        runtimeClasspath += main.output + test.output
    }
}

configurations {
    integrationImplementation.extendsFrom testImplementation
    integrationRuntime.extendsFrom testRuntime
}

test {
    useJUnitPlatform()

    afterTest { desc, result ->
        println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
    }
}

//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
                'Multi-Release': true,
                'Main-Class': "$mainClassName"
    }
    project.archivesBaseName = project.name + '-full'
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

task integrationTest(type: Test) {
    useJUnitPlatform()

    description = 'Runs the integration tests.'
    group = 'verification'
    testClassesDirs = sourceSets.integration.output.classesDirs
    classpath = sourceSets.integration.runtimeClasspath
    outputs.upToDateWhen { false }
    mustRunAfter test

    afterTest { desc, result ->
        println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
    }
}

check.dependsOn integrationTest

dependencies {
    implementation "io.ktor:ktor-server-core:$ktor_version"
    implementation "io.ktor:ktor-server-host-common:$ktor_version"
    implementation "io.ktor:ktor-server-netty:$ktor_version"
    implementation "io.ktor:ktor-jackson:$ktor_version"
    implementation "io.ktor:ktor-locations:$ktor_version"
    implementation "io.ktor:ktor-gson:$ktor_version"
    implementation "io.ktor:ktor-client-serialization:$ktor_version"
    implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version"
    implementation "io.ktor:ktor-client-jetty:$ktor_version"
    implementation "org.kodein.di:kodein-di-generic-jvm:$kodein_version"
    implementation "org.jetbrains.exposed:exposed-core:$exposed_version"
    implementation "org.jetbrains.exposed:exposed-dao:$exposed_version"
    implementation "org.jetbrains.exposed:exposed-jdbc:$exposed_version"
    implementation "org.jetbrains.exposed:exposed-jodatime:$exposed_version"
    implementation "org.postgresql:postgresql:$postgres_version"
    implementation "org.apache.logging.log4j:log4j-api:$log4j2_version"
    implementation "org.apache.logging.log4j:log4j-core:$log4j2_version"
    implementation "org.apache.logging.log4j:log4j-slf4j-impl:$log4j2_version"
    implementation "org.springframework.security:spring-security-core:5.1.5.RELEASE"
    implementation "com.amazonaws:aws-java-sdk-ses:$aws_sdk_version"
    implementation "com.amazonaws:aws-java-sdk-s3:$aws_sdk_version"
    implementation "com.stripe:stripe-java:$stripe_version"
    implementation "org.apache.velocity:velocity-engine-core:2.1"
    implementation "com.openhtmltopdf:openhtmltopdf-core:$html_to_pdf_version"
    implementation "com.openhtmltopdf:openhtmltopdf-pdfbox:$html_to_pdf_version"
    implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.3"
    implementation "org.jetbrains.exposed:exposed-jodatime:$exposed_version"
    implementation "io.rest-assured:rest-assured:4.3.0"
    implementation "org.hamcrest:hamcrest:2.2"
    testImplementation "io.kotest:kotest-runner-junit5-jvm:$kotlintest_version" // for kotest framework
    testImplementation "io.kotest:kotest-assertions-core-jvm:$kotlintest_version" // for kotest core jvm assertions
    testImplementation "org.assertj:assertj-core:3.11.1"
    testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version"
    testImplementation "org.junit.jupiter:junit-jupiter-params:$junit_version"
    testImplementation "io.ktor:ktor-server-tests:$ktor_version"
    testImplementation "io.ktor:ktor-server-core:$ktor_version"
    testImplementation "io.ktor:ktor-server-host-common:$ktor_version"
    testImplementation "io.ktor:ktor-gson:$ktor_version"
    testImplementation "io.mockk:mockk:1.9.3"
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.5'
    testRuntime "org.junit.jupiter:junit-jupiter-engine:$junit_version"
}

> Task :integrationClasses UP-TO-DATE
Skipping task ':integrationClasses' as it has no actions.
:integrationClasses (Thread[Daemon worker Thread 29,5,main]) completed. Took 0.0 secs.
:integrationTest (Thread[Daemon worker Thread 29,5,main]) started.
Gradle Test Executor 19 started executing tests.
Gradle Test Executor 19 finished executing tests.

> Task :integrationTest FAILED
file or directory '/opt/receptioner/bookmybusiness/build/classes/java/integration', not found
Caching disabled for task ':integrationTest' because:
  Build cache is disabled
Task ':integrationTest' is not up-to-date because:
  Task.upToDateWhen is false.
file or directory '/opt/receptioner/bookmybusiness/build/classes/java/integration', not found
Starting process 'Gradle Test Executor 19'. Working directory: /opt/receptioner/bookmybusiness Command: /usr/lib/jvm/java-13-openjdk-amd64/bin/java -Dorg.gradle.native=false @/tmp/gradle-worker-classpath16424721448345780337txt -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=NZ -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 19'
Successfully started process 'Gradle Test Executor 19'
Finished generating test XML results (0.0 secs) into: /opt/receptioner/bookmybusiness/build/test-results/integrationTest
Generating HTML test report...
Finished generating test html results (0.0 secs) into: /opt/receptioner/bookmybusiness/build/reports/tests/integrationTest
:integrationTest (Thread[Daemon worker Thread 29,5,main]) completed. Took 0.523 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':integrationTest'.
> There were failing tests. See the report at: file:///opt/receptioner/bookmybusiness/build/reports/tests/integrationTest/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.2.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 1s
13 actionable tasks: 1 executed, 12 up-to-date

奇怪的是,失败的任务是指 classes/java/integration 文件夹(不存在)而不是 classes/kotlin/integration 文件夹,它确实存在,这是编译代码所在的位置。

【问题讨论】:

    标签: kotlin gradle


    【解决方案1】:

    这是我的错。在我将代码从 test 移动到 integration 文件夹后,里面的一些资源(那些负责初始化类的资源)指向旧目录 test,而不是 integration。 Gradle 构建文件是正确的。

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 2017-10-30
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多