在assertk中有没有更简洁的方式断言数组元素匹配指定谓词?
解决方案
方案1:简化现有matchesPredicate逻辑
直接用Kotlin标准库的zip+all函数替代手写遍历,代码更简洁,和原有逻辑完全等价:
fun Assert<DoubleArray>.isCloseTo(expected: DoubleArray, delta: Double) { hasSameSizeAs(expected) matchesPredicate { actual -> actual.zip(expected).all { (actualVal, expectedVal) -> actualVal.isCloseTo(expectedVal, delta) } } } // 修正原有代码参数名不统一的问题:入参是delta,内部判断统一用delta fun Double.isCloseTo(expected: Double, delta: Double): Boolean { return abs(this - expected) <= delta }
方案2:使用assertk原生API实现更优效果(完全符合伪代码预期)
assertk内置的containsExactly方法支持传入每个位置的断言规则,完全匹配你想要的按索引逐个校验元素的效果,而且断言失败时会自动输出不匹配的下标、实际值、期望值,错误提示比手写matchesPredicate友好得多:
import assertk.assertions.containsExactly import assertk.assertions.support.closeTo fun Assert<DoubleArray>.isCloseTo(expected: DoubleArray, delta: Double) { containsExactly(*expected.map { closeTo(it, delta) }.toTypedArray()) }
这个实现不需要单独调用hasSameSizeAs,containsExactly本身会先校验数组长度是否一致,长度不匹配时会直接抛出对应错误。同时你也不需要自己实现Double.isCloseTo扩展,assertk已经内置了对应的closeTo断言工具,直接导入即可使用。
内容的提问来源于stack exchange,提问作者Hakanai
相关产品推荐
相关产品推荐

