JUnit参数化测试UInt参数传合法值却报Int转换错误是什么原因?
问题原因
- 核心原因是 JUnit Jupiter 默认不支持Kotlin特有的无符号类型转换。JUnit作为Java生态原生的测试框架,内置的参数类型转换逻辑仅覆盖了JDK标准提供的类型,Kotlin的
UInt、ULong这类无符号值类不在默认支持范围内。 - 你看到的尝试转
Integer的行为,和Kotlin无符号类型的实现原理有关:UInt是Kotlin特有的值类(inline class),编译期会发生类型擦除,非空UInt在JVM字节码层面的底层存储类型就是int/Integer。JUnit的参数解析器无法识别Kotlin侧的UInt语义元数据,只会按照字节码层面的底层类型Integer做转换,而4116972106超出了有符号Integer的最大值(2147483647),因此抛出转换异常。
可选解决方法
如果要继续使用UInt作为参数类型,可以自定义JUnit参数转换器适配:
class UIntConverter : ArgumentConverter { override fun convert( source: Any, context: ParameterContext, extensionContext: ExtensionContext ): Any { return (source as String).toUInt() } }
使用时在参数上添加@ConvertWith注解指定转换器即可:
@ParameterizedTest @CsvSource( "1, 4116972106" ) fun `my test`(input: Int, @ConvertWith(UIntConverter::class) expected: UInt) { // 测试逻辑 }
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

