【问题标题】:How to separate unit and integration tests when in gradle project with micronaut and kotlin?在使用 micronaut 和 kotlin 的 gradle 项目中如何分离单元测试和集成测试?
【发布时间】:2021-11-18 14:43:24
【问题描述】:

我正在尝试使用 Gradle 的 Kotlin DSL for Gradle 构建文件,在带有 Micronaut 和 Kotlin 的 Gradle 项目中将单独的单元和集成测试单独的 Gradle 任务。

我遵循了 Gradle 文档中的常规步骤,但似乎我缺少一些 Micronaut 特定的设置步骤,尤其是与 kapt 相关的步骤。

这是我从标准 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"
        }
    }
}

如果现在我运行如下所示的集成测试:

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

我得到错误:

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)
...

这导致我相信我的配置文件中缺少与 Micronaut 或 Kapt 相关的东西。任何帮助将不胜感激。

【问题讨论】:

    标签: kotlin gradle micronaut kapt


    【解决方案1】:

    我遇到的问题是因为未将 kapt 配置为使用新添加的集成测试源集。 Kotlin 对 micronaut 的注解处理在 microunaut 插件配置的 processing 块中配置。我需要做的是在那里添加额外的源集:

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

    为此,sourceSet 部分需要位于 microunaut 插件配置部分之前。

    最终结果,一切都按预期工作,如下所示:

    
    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"
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 2016-10-03
      • 2016-01-23
      • 2014-11-15
      • 1970-01-01
      • 2013-10-23
      • 2019-02-04
      • 2020-02-21
      相关资源
      最近更新 更多