Gradle integration test task for Kotlin classes

Viewed 1140

I have a Gradle project with Kotlin with 3 source folders (main, test, integration). I want to set up different Gradle test tasks for unit and integration tests. That what those test and integration folders are for. I tried several solutions to set up integration test task but nothing worked so far. It's mentioned everywhere that I need to create a different sourceSet for integration, add some configuration to be able to compile the code in that folder properly and set up the task itself. It's all done, but when I run the tests, they fail. The report then says ClassNotFound for everything basically what is inside that(integration) folder. build.gradle file and the output results are attached below

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

It's weird though that the failed task refers to classes/java/integration folder (which does't exist) instead of classes/kotlin/integratin folder, which does exist and this is where the compiled code resides in.

1 Answers

It was my bad. After I moved the code from test to integration folder, some resources inside (those which are responsible for initializing the classes) were pointing to the old directory test, not integration. The Gradle build file is correct.

Related