【问题标题】:Kotlin Junit5 ValueSource as an array variableKotlin Junit5 ValueSource 作为数组变量
【发布时间】:2021-11-22 07:35:43
【问题描述】:

我有一个键和值的映射,我想将键作为数组添加到 ValueSource,但出现错误。我错在哪里?

这是我的代码

   private val id = mapOf("abc" to 10001,"def" to 955,"ghi" to 804,"jkl" to 805)
    private val ids:Array<String> = id.keys.toTypedArray()
    
    @ParameterizedTest
    @ValueSource(strings = ids)
    fun idConverterImpl(memberId: String) {
}

【问题讨论】:

    标签: kotlin junit parameterized-unit-test


    【解决方案1】:

    注解的参数必须是编译时常量。 ids 不是编译时间常数。它是id.keys.toTypedArray() 的值,必须在运行时计算。

    你可以像这样内联写它:

    @ParameterizedTest
    @ValueSource(strings = ["abc", "def", "ghi", "jkl"])
    fun idConverterImpl(memberId: String) { ... }
    

    如果您不想在多个位置复制地图的键,则可以改用MethodSource。这允许您通过提供将生成参数的方法,将非编译时常量作为测试的参数。

    您需要将地图和值设为静态:

    companion object {
        @JvmStatic
        private val id = mapOf("abc" to 100016040, "def" to 955803, "ghi" to 955804, "jkl" to 955805)
    
        @JvmStatic
        private val ids by lazy { id.keys }
    }
    

    通过在 ids 上使用属性委托,我让 Kotlin 生成了一个 getIds 方法,然后我可以使用 MethodSource 来引用它:

    @ParameterizedTest
    @MethodSource("getIds")
    fun idConverterImpl(memberId: String) { ... }
    

    【讨论】:

      【解决方案2】:

      你的键映射和获取没问题,你可能有其他类型的问题我猜是private你的测试无法获取数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2011-01-11
        • 2021-03-24
        • 2021-06-24
        • 2018-04-01
        相关资源
        最近更新 更多