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

能否通过编译器标志全局禁用Kotlin @JvmInline值类的内联?

解决单元测试中Mock值类的unbox-impl异常问题

要在单元测试时全局禁用@JvmInline value class的内联,生产环境保持正常内联,你可以通过Kotlin编译器的-Xno-inline-value-classes参数实现,以下是不同构建工具的配置方式:

Gradle(Kotlin DSL)

在build.gradle.kts中添加如下配置,仅对测试代码编译生效:

tasks.withType<KotlinCompile>().configureEach {
    kotlinOptions {
        if (name.contains("Test")) {
            freeCompilerArgs += "-Xno-inline-value-classes"
        }
    }
}

或者更精准地针对测试任务配置:

tasks.test {
    kotlinOptions {
        freeCompilerArgs += "-Xno-inline-value-classes"
    }
}

Gradle(Groovy)

在build.gradle中配置:

tasks.withType(KotlinCompile) {
    kotlinOptions {
        if (name.contains('Test')) {
            freeCompilerArgs += '-Xno-inline-value-classes'
        }
    }
}

Maven

在pom.xml的Kotlin插件中,为测试编译阶段添加参数:

<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <args>
                            <arg>-Xno-inline-value-classes</arg>
                        </args>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

原理说明

添加-Xno-inline-value-classes参数后,测试代码编译时所有值类会被当作普通包装类处理,而非被内联到调用处。这样mockk就能正常创建值类的mock实例,避免触发unbox-impl()方法找不到响应的异常。生产代码编译时不会应用该参数,依然保留值类的内联优化特性。

内容的提问来源于stack exchange,提问作者dta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:35:19