如何使用ScalaCheck写一个永远不会两次返回同一个对象的Gen[A]
?
Gen.oneOf(a,b,c)
可以重复选择同一个对象,因此不起作用。
我在specs2中编写了一个可变规范,我想这样做的原因是因为被测系统的行为应该只允许每个对象在某种意义上被“使用”一次。 / p>
编辑:根据==
我的意思是“相同”,并且对象实际上是字符串,所以我不能每次只创建相同的字符串。 / p>
答案 0 :(得分:3)
我不完全确定你在问什么,但是有一个名为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