junit 有assertAll,它允许您执行所有必需的检查,而不会对其中之一抛出异常,从而忽略其余的。例如:
assertAll(
{ assertEquals(a, b) },
{ assertEquals(c, d) },
)
Kotlin 语言是否有类似的工具来执行多项检查?
例如,类似 checkAll 的东西:
checkAll(
check(a == b) { "error 1" },
check(c == d) { "error 2" },
}
如果两个条件都为假,则在输出中我们得到:
错误1
错误2
你可以构建一些非常简单的东西来做到这一点
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)
}
将给出一个包含未通过的字符串的列表
在 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 错误