我有一个看起来像这样的方法:
def compute[T](l: List[T]): List[T] = {
val shuffled = util.Random.shuffle(l)
// do some more computations
}
我想为我的单元测试播种随机数生成器,这样我就不必将我的方法分解为两种方法并仅测试计算,因为这是将在外部使用的方法。这可以在ScalaTest中完成吗?
答案 0 :(得分:4)
我在ScalaTest中没有太多背景知识,但是如果你打电话给setSeed(seed: Long): Unit
,那么对于任何给定的种子值,你总会得到相同的随机播放。
scala> util.Random.shuffle(Seq(1,2,3,4,5,6,7,8,9,0))
res0: Seq[Int] = List(6, 0, 8, 5, 4, 7, 2, 3, 1, 9)
scala> util.Random.setSeed(57L)
scala> util.Random.shuffle(Seq(1,2,3,4,5,6,7,8,9,0))
res1: Seq[Int] = List(5, 3, 2, 0, 6, 8, 7, 4, 1, 9)
scala> util.Random.setSeed(57L)
scala> util.Random.shuffle(Seq(1,2,3,4,5,6,7,8,9,0))
res2: Seq[Int] = List(5, 3, 2, 0, 6, 8, 7, 4, 1, 9)
答案 1 :(得分:2)
您如何测试取决于当前时间的方法?还是数据库状态?或来自谷歌的回复?或睡了一段时间?
通常当您测试依赖于某些外部状态(时间,其他系统或在您的情况下:entropy / seed)的任何代码时,您将重构该代码并提取依赖项。一种方式,正如@jwvh所说是提取种子。但是imho,你应该提取整个转型
因此,您应该创建一个接收混洗数组并测试该方法的方法