Kotlin 中的 check 方法有类似的 assertAll 吗?

问题描述 投票:0回答:2

junit 有assertAll,它允许您执行所有必需的检查,而不会对其中之一抛出异常,从而忽略其余的。例如:

assertAll(
    { assertEquals(a, b) },
    { assertEquals(c, d) },
)

Kotlin 语言是否有类似的工具来执行多项检查?
例如,类似 checkAll 的东西:

checkAll(
    check(a == b) { "error 1" },
    check(c == d) { "error 2" },
}

如果两个条件都为假,则在输出中我们得到:
错误1
错误2

kotlin assert
2个回答
0
投票

你可以构建一些非常简单的东西来做到这一点

fun check(checkExpression: Boolean, message: () -> String): Pair<Boolean, () -> String> {
    return Pair(checkExpression, message)
}


fun checkAll(vararg checks: Pair<Boolean, () -> String>): List<String> {
    return checks.filter { !it.first }.map { it.second() }
}

所以

fun main() {
    val a = 1
    val b = 2
    val c = 3
    val d = 4

    val result = checkAll(
        check( a == b ) { "a != b" },
        check( c == d ) { "c != d" },
    )

    // result is list of strings ["a != b", "c != d"]
    println(result)
}

将给出一个包含未通过的字符串的列表


-1
投票

在 Kotlin 中,您可以使用断言函数和 lambda 表达式来实现类似的行为。尽管没有与 JUnit 的 assertAll 方法直接等效的方法,但您可以自己实现类似的功能。这是一种方法:

  fun checkAll(vararg assertions: () -> Boolean) {
val errors = mutableListOf<String>()
assertions.forEachIndexed { index, assertion ->
    if (!assertion()) {
        errors.add("Error ${index + 1}")
    }
}
if (errors.isNotEmpty()) {
    throw AssertionError(errors.joinToString("\n"))
}

}

// Example usage
val a = 10
val b = 20
val c = 30
val d = 40

checkAll(
{ a == b },
{ c == d }
   )



 

checkAll 接受 lambda 表达式的可变参数,每个参数代表一个要检查的条件。 在 checkAll 内部,它会迭代每个断言,检查其计算结果是否为 false。如果断言为假,则会将错误消息添加到错误列表中。 如果错误列表中积累了任何错误,它会抛出一个包含所有错误消息的 AssertionError 错误

© www.soinside.com 2019 - 2024. All rights reserved.