简体   繁体   English

在带有 micronaut 和 kotlin 的 gradle 项目中,如何分离单元测试和集成测试?

[英]How to separate unit and integration tests when in gradle project with micronaut and kotlin?

I'm attempting separate unit and integration tests into separate Gradle tasks in Gradle project with Micronaut and Kotlin, using Gradle's Kotlin DSL for Gradle build file. I'm attempting separate unit and integration tests into separate Gradle tasks in Gradle project with Micronaut and Kotlin, using Gradle's Kotlin DSL for Gradle build file.

I followed the usual steps from Gradle's documentation, but it seems I'm missing some Micronaut specific setup steps, particularly related to kapt.我遵循了 Gradle 文档中的常规步骤,但似乎我缺少一些 Micronaut 特定的设置步骤,尤其是与 kapt 相关的步骤。

Here's my build.gradle.kts that I've adapted from the standard Micronaut project template:这是我从标准 Micronaut 项目模板改编而来的build.gradle.kts

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.5.21"
    id("org.jetbrains.kotlin.kapt") version "1.5.21"
    id("com.github.johnrengelman.shadow") version "7.1.0"
    id("io.micronaut.application") version "2.0.8"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.5.21"
}

version = "0.1"
group = "com.example"

val kotlinVersion=project.properties.get("kotlinVersion")
repositories {
    mavenCentral()
}

micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
    }
}

sourceSets {
    create("intTest") {
        compileClasspath += sourceSets.main.get().output
        runtimeClasspath += sourceSets.main.get().output
    }
}

val intTestImplementation: Configuration by configurations.getting {
    extendsFrom(configurations.testImplementation.get())
}

configurations["intTestRuntimeOnly"].extendsFrom(configurations.runtimeOnly.get())


dependencies {
    kapt("io.micronaut:micronaut-http-validation")
    kapt("io.micronaut.data:micronaut-data-processor")
    kapt("io.micronaut.openapi:micronaut-openapi")
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut:micronaut-runtime")
    implementation("io.micronaut.data:micronaut-data-jdbc")
    implementation("io.micronaut.flyway:micronaut-flyway")
    implementation("io.micronaut.gcp:micronaut-gcp-pubsub")
    implementation("io.micronaut.kotlin:micronaut-kotlin-extension-functions")
    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
    implementation("io.micronaut.sql:micronaut-jdbc-hikari")
    implementation("io.swagger.core.v3:swagger-annotations")
    implementation("javax.annotation:javax.annotation-api")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    runtimeOnly("ch.qos.logback:logback-classic")
    runtimeOnly("org.postgresql:postgresql")

    //Testing dependencies
    testImplementation("org.mockito:mockito-core:3.12.4")
    testImplementation("org.mockito.kotlin:mockito-kotlin:3.2.0")
    testImplementation("io.micronaut.test:micronaut-test-junit5")

    //Integration testing dependencies
    intTestImplementation("org.testcontainers:junit-jupiter")
    intTestImplementation("org.testcontainers:postgresql")
    intTestImplementation("org.testcontainers:testcontainers")
    intTestImplementation("io.micronaut.test:micronaut-test-junit5")
 
    implementation("io.micronaut:micronaut-validation")

    runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")

}


application {
    mainClass.set("com.example.ApplicationKt")
}
java {
    sourceCompatibility = JavaVersion.toVersion("11")
}


val integrationTest = task<Test>("intTest") {
    description = "Runs integration tests."
    group = "verification"

    testClassesDirs = sourceSets["intTest"].output.classesDirs
    classpath = sourceSets["intTest"].runtimeClasspath
    shouldRunAfter("test")
}

tasks.check { dependsOn(integrationTest) }

tasks {
    compileKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
}

If now I run my integration test that looks like this:如果现在我运行如下所示的集成测试:

@MicronautTest
internal class ExampleIntegrationTest {
    @Test
    fun test() {}
}

I get the error:我得到错误:

org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [io.micronaut.test.extensions.junit5.MicronautJunit5Extension]: @MicronautTest used on test but no bean definition for the test present. This error indicates a misconfigured build or IDE. Please add the 'micronaut-inject-java' annotation processor to your test processor path (for Java this is the testAnnotationProcessor scope, for Kotlin kaptTest and for Groovy testCompile). See the documentation for reference: https://micronaut-projects.github.io/micronaut-test/latest/guide/
    at app//org.junit.jupiter.engine.execution.ConditionEvaluator.evaluationException(ConditionEvaluator.java:81)
    at app//org.junit.jupiter.engine.execution.ConditionEvaluator.evaluate(ConditionEvaluator.java:69)
    at app//org.junit.jupiter.engine.execution.ConditionEvaluator.lambda$evaluate$0(ConditionEvaluator.java:55)
    at java.base@15.0.2/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
...

Which leads be to believe that there's something Micronaut or Kapt related missing in my conifg.这导致我相信我的配置文件中缺少与 Micronaut 或 Kapt 相关的东西。 Any help would be appreciated.任何帮助,将不胜感激。

The issue I was experiencing happened because kapt was not configured to work with newly added integration test source set.我遇到的问题是因为未将 kapt 配置为使用新添加的集成测试源集。 Kotlin's annotation processing for micronaut is configured in microunaut plugin configuration's processing block. Kotlin 对 micronaut 的注释处理是在microunaut插件配置的processing块中配置的。 What I needed to do was to add additional source set there:我需要做的是在那里添加额外的源集:

micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
        additionalSourceSets.add(sourceSets.getByName("intTest")) //add additional integration testing sources set
    }
}

For this to work sourceSet section needed to come before microunaut plugin config section.为此, sourceSet部分需要microunaut插件配置部分之前。

Final result, where everything worked as expected looked like this:最终结果,一切都按预期工作,如下所示:


plugins {
    id("org.jetbrains.kotlin.jvm") version "1.5.21"
    id("org.jetbrains.kotlin.kapt") version "1.5.21"
    id("com.github.johnrengelman.shadow") version "7.1.0"
    id("io.micronaut.application") version "2.0.8"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.5.21"
}

version = "0.1"
group = "com.example"

val kotlinVersion=project.properties.get("kotlinVersion")
repositories {
    mavenCentral()
}

// Include integration test source sets and configurations
sourceSets {
    create("intTest") {
        compileClasspath += sourceSets.main.get().output + sourceSets.test.get().output
        runtimeClasspath += sourceSets.main.get().output + sourceSets.test.get().output
    }
}
val intTestImplementation: Configuration by configurations.getting {
    extendsFrom(configurations.testImplementation.get())
}
val intTestRuntimeOnly: Configuration by configurations.getting {
    extendsFrom(configurations.testRuntimeOnly.get())
}

// Micronaut plugin to set runtime, test platform, and annotation processing
micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
        additionalSourceSets.add(sourceSets.getByName("intTest"))
    }
}

dependencies {
    kapt("io.micronaut:micronaut-http-validation")
    kapt("io.micronaut.data:micronaut-data-processor")
    kapt("io.micronaut.openapi:micronaut-openapi")
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut:micronaut-runtime")
    implementation("io.micronaut.data:micronaut-data-jdbc")
    implementation("io.micronaut.flyway:micronaut-flyway")
    implementation("io.micronaut.gcp:micronaut-gcp-pubsub")
    implementation("io.micronaut.kotlin:micronaut-kotlin-extension-functions")
    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
    implementation("io.micronaut.sql:micronaut-jdbc-hikari")
    implementation("io.swagger.core.v3:swagger-annotations")
    implementation("javax.annotation:javax.annotation-api")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    runtimeOnly("ch.qos.logback:logback-classic")
    runtimeOnly("org.postgresql:postgresql")

    //Testing dependencies
    testImplementation("org.mockito:mockito-core:3.12.4")
    testImplementation("org.mockito.kotlin:mockito-kotlin:3.2.0")
    testImplementation("io.micronaut.test:micronaut-test-junit5")

    //Integration testing dependencies
    intTestImplementation("org.testcontainers:junit-jupiter")
    intTestImplementation("org.testcontainers:postgresql")
    intTestImplementation("org.testcontainers:testcontainers")

    implementation("io.micronaut:micronaut-validation")

    runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")

}


application {
    mainClass.set("com.example.ApplicationKt")
}

java {
    sourceCompatibility = JavaVersion.toVersion("11")
}


// Integration test gradle task
val integrationTest = task<Test>("intTest") {
    description = "Runs integration tests."
    group = "verification"

    testClassesDirs = sourceSets["intTest"].output.classesDirs
    classpath = sourceSets["intTest"].runtimeClasspath
    shouldRunAfter("test")
}

tasks.check { dependsOn(integrationTest) }

tasks {
    compileKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM