Kotlin Junit5 ValueSource 作为数组变量

标签 kotlin junit parameterized-unit-test

我有一个键和值的映射,我想将键作为数组添加到 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) {
}

最佳答案

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

您可以像这样内联编写它:

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

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

您需要将 map 和值设为静态:

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 上使用属性委托(delegate),我让 Kotlin 生成一个 getIds 方法,然后我可以使用 MethodSource 引用该方法:

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

关于Kotlin Junit5 ValueSource 作为数组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70062319/

相关文章:

java - 使用继承的 AssertJ usingComparatorForType 方法

java - 从 .properties 文件为 JUnit 初始化一个常量,该文件本身是从 pom.xml 文件初始化的

selenium-webdriver - 如何在 JUnit 5 中参数化 beforeEach()?

android - 将数据从底部工作表对话框 fragment 传递到 fragment

android - 如何在 Mapbox map 上的 2 点之间绘制直线?

android - 与 Android 和桌面项目共享 Kotlin 模块

c# - MSTest 相当于 NUnit 的参数化测试吗?

android - 尽管 Realm 被模拟,但实际的 close() 方法被调用

java - 为什么 Cobertura 在通过 Eclipse 插件运行时报告覆盖率为 0%?

delphi - 我可以在 DUnit 中编写 'parameterized' 测试吗