如何使用 ScalaCheck 编写一个永远不会返回同一对象两次的 Gen[A]
?
Gen.oneOf(a,b,c)
可以重复选择同一个对象,所以这是行不通的。
我正在specs2中编写一个可变规范,我想这样做的原因是因为在某种意义上,被测系统的行为应该是只允许每个对象被“使用”一次。
编辑:“相同”是指根据==
相同,并且对象实际上是字符串,所以我不能只创建相同的字符串每次。
最佳答案
我不完全确定你在问什么,但是有一个名为 Gen.wrap
的生成器组合器,它在每次生成器本身被求值时都会求值其参数。这样,您就可以强制创建新对象。请参阅下面的示例(请注意,如果需要,您可以跳过 Gen.value
的使用,而是依赖隐式转换 A => Gen[A]
):
scala> import org.scalacheck._
import org.scalacheck._
scala> class A
defined class A
scala> val g1: Gen[A] = Gen.value(new A)
g1: org.scalacheck.Gen[A] = Gen()
scala> g1.sample.get
res0: A = A@45243a0f
scala> g1.sample.get
res1: A = A@45243a0f
scala> val g2: Gen[A] = Gen.wrap(Gen.value(new A))
g2: org.scalacheck.Gen[A] = Gen()
scala> g2.sample.get
res2: A = A@331d4d66
scala> g2.sample.get
res3: A = A@728aed09
关于specs2 - ScalaCheck 选择无需替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746196/