Micronaut 2.5.13集成Spock测试时编译失败求助
使用Micronaut 2.5.13版本,在src/test/groovy/{package_name}目录下编写Spock测试用例时,执行:compileTestGroovy任务失败,抛出ExceptionInInitializerError,根源为io.micronaut.inject.annotation.internal.KotlinNullableMapper cannot be cast to io.micronaut.inject.annotation.AnnotationMapper。已尝试移除JUnit依赖,问题仍未解决。
测试代码
import io.micronaut.context.ApplicationContext import io.micronaut.context.env.Environment import io.micronaut.runtime.EmbeddedApplication import io.micronaut.test.extensions.spock.annotation.MicronautTest import spock.lang.Specification import spock.lang.Unroll import javax.inject.Inject @MicronautTest class EnvironmentDetectionSpec extends Specification { @Unroll void "test environment is detected automatically" () { given: ApplicationContext ctx = ApplicationContext.run() expect: ctx.environment.getActiveNames().contains(Environment.TEST) cleanup: ctx.close() } }
异常信息
Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileTestGroovy'. ...(省略中间栈信息) Caused by: java.lang.ClassCastException: io.micronaut.inject.annotation.internal.KotlinNullableMapper cannot be cast to io.micronaut.inject.annotation.AnnotationMapper at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.<clinit>(AbstractAnnotationMetadataBuilder.java:70) ... 33 more
build.gradle配置
plugins { id("com.github.johnrengelman.shadow") version "7.0.0" id("io.micronaut.application") version "1.5.4" id "groovy" } version = "0.1" group = {groupName} repositories { mavenCentral() } dependencies { implementation ('org.projectlombok:lombok:1.18.24') implementation("io.micronaut:micronaut-http-client") implementation("io.micronaut:micronaut-runtime") implementation("io.micronaut.sql:micronaut-jdbc-hikari") implementation("io.micronaut.sql:micronaut-jdbi") implementation 'com.google.code.gson:gson:2.9.0' implementation 'io.micronaut:micronaut-inject-java:3.4.3' implementation 'io.micronaut:micronaut-inject:3.4.3' implementation 'io.github.crac.io.micronaut:micronaut-inject-java:1.3.7' implementation 'redis.clients:jedis:2.8.2' implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.19' runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.postgresql:postgresql") implementation("io.micronaut:micronaut-validation") // Testing dependencies testImplementation("org.spockframework:spock-core") { exclude group: "org.codehaus.groovy", module: "groovy-all" } testImplementation "io.micronaut:micronaut-inject-groovy" testImplementation "io.micronaut.test:micronaut-test-spock" } application { mainClass.set("com.suvodip.panapplication.Application") } java { sourceCompatibility = JavaVersion.toVersion("1.8") targetCompatibility = JavaVersion.toVersion("1.8") } micronaut { runtime("netty") testRuntime("spock2") processing { incremental(true) annotations({packageName}) } }
解决方法
核心原因
依赖版本不匹配:项目指定Micronaut版本为2.5.13,但手动引入了3.4.3版本的micronaut-inject和micronaut-inject-java,同时还引入了不兼容的io.github.crac.io.micronaut:micronaut-inject-java:1.3.7,不同版本的类文件冲突导致类型转换异常。
具体修复步骤
移除冲突的高版本依赖:删除
dependencies中的以下两行implementation 'io.micronaut:micronaut-inject-java:3.4.3' implementation 'io.micronaut:micronaut-inject:3.4.3'Micronaut插件会根据项目配置的
micronautVersion自动引入对应版本的依赖,无需手动指定。移除不兼容的CRaC依赖:删除这一行
implementation 'io.github.crac.io.micronaut:micronaut-inject-java:1.3.7'CRaC相关的Micronaut适配版本需与核心框架版本匹配,当前版本不兼容2.5.13,若需使用需查找对应兼容版本。
清理缓存并重新构建:执行以下Gradle命令
./gradlew clean build
额外优化建议
使用@MicronautTest注解时,无需手动创建ApplicationContext,注解会自动管理上下文,可简化测试代码:
import io.micronaut.context.env.Environment import io.micronaut.test.extensions.spock.annotation.MicronautTest import spock.lang.Specification import spock.lang.Unroll import javax.inject.Inject @MicronautTest class EnvironmentDetectionSpec extends Specification { @Inject Environment environment @Unroll void "test environment is detected automatically" () { expect: environment.activeNames.contains(Environment.TEST) } }
内容的提问来源于stack exchange,提问作者suvodipMondal

