You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut 2.5.13集成Spock测试时编译失败求助

问题:Micronaut 2.5.13 Spock测试编译失败,ClassCastException异常

使用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,不同版本的类文件冲突导致类型转换异常。

具体修复步骤

  1. 移除冲突的高版本依赖:删除dependencies中的以下两行

    implementation 'io.micronaut:micronaut-inject-java:3.4.3'
    implementation 'io.micronaut:micronaut-inject:3.4.3'
    

    Micronaut插件会根据项目配置的micronautVersion自动引入对应版本的依赖,无需手动指定。

  2. 移除不兼容的CRaC依赖:删除这一行

    implementation 'io.github.crac.io.micronaut:micronaut-inject-java:1.3.7'
    

    CRaC相关的Micronaut适配版本需与核心框架版本匹配,当前版本不兼容2.5.13,若需使用需查找对应兼容版本。

  3. 清理缓存并重新构建:执行以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:20:46