我有一个这样的功能:
fun foo(a: Boolean, b: Boolean, c: Boolean) { /*...*/ }
我想用所有可能的参数值来测试它:
for (a in false..true)
for (b in false..true)
for (c in false..true) {
val expected = ...
assertThat(foo(a, b, c)).isEqualTo(expected)
}
但不幸的是 Kotlin 没有 BooleanRange 类型。
我可以这样做:
for (a in 0..1)
for (b in 0..1)
for (c in 0..1) {
val expected = ...
assertThat(foo(a == 1, b == 1, c == 1)).isEqualTo(expected)
}
但这根本不清楚。
我能做到:
for (a in arrayOf(false, true))
for (b in arrayOf(false, true))
for (c in arrayOf(false, true)) {
val expected = ...
assertThat(foo(a, b, c)).isEqualTo(expected)
}
但这仍然太冗长了。有没有更简洁的方法,也许 Kotlin 有一个函数可以直接迭代 false 和 true 这两个值?我看到它有一个
BooleanIterator
类型,但我不确定这在这里是否有任何用处。
您的解决方案效果很好。以下是另一种选择,但可能难以理解。使用
BitSet
获取布尔值的所有组合,我们可以扩展到任意数量的布尔值。
(0 until 8L).map {
BitSet.valueOf(longArrayOf(it))
}.map {
assertThat(foo(it[0], it[1], it[2])).isEqualTo(expected)
}
您可以使用
@ParamerterizedTest
将布尔组合移出实际测试。您可以获得所有组合的测试输出,有助于调试测试参数的问题。
companion object {
private val expected = arrayOf(...)
@JvmStatic fun provideInput() : Stream<Arguments> {
return (0 until 8).map {
val b = BitSet.valueOf(longArrayOf(it.toLong()))
Arguments.of(b[0], b[1], b[2], expected[it])
}.stream()
}
}
@ParameterizedTest
@MethodSource("provideInput")
fun test(a: Boolean, b: Boolean, c: Boolean, expected: Boolean){
assertThat(foo(a,b,c)).isEqualTo(expected)
}