能否通过编译器标志全局禁用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
相关产品推荐
相关产品推荐

