这是一段代码,用于生成给定范围内的随机Long值,为清楚起见对其进行了简化:
def getLong(min: Long, max: Long): Long = {
if(min > max) {
throw new IncorrectBoundsException
}
val rangeSize = (max - min + 1L)
val randValue = math.abs(Random.nextLong())
val result = (randValue % (rangeSize)) + min
result
}
我知道这个结果并不统一,这不会为一些值正常工作min
和max
,但这不是重点。
在测试中发现,以下断言并不总是正确的:
getLong(-1L, 1L) >= -1L
更具体地说,返回值是-3
。这怎么可能呢?
事实证明,math.abs(x: Long): Long
不能保证总是返回非负值!没有Long
可以表示的值math.abs(Long.MinValue)
,因此,它不会抛出异常,而是math.abs
返回Long.MinValue
:
scala> Long.MinValue
res27: Long = -9223372036854775808
scala> math.abs(Long.MinValue)
res28: Long = -9223372036854775808
scala> math.abs(Long.MinValue) % 3
res29: Long = -2
scala> math.abs(Long.MinValue) % 3 + (-1)
res30: Long = -3
在我看来,这是一个很好的例子,说明了为什么应该使用ScalaCheck来测试其代码库的至少一部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句