[英]Adding integration tests to Kotlin project using the Kotlin Gradle DSL
[英]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.
我遵循了 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 相关的东西。 任何帮助,将不胜感激。
我遇到的问题是因为未将 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"
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.