在另一个生成器中使用 ScalaCheck 生成器

Use ScalaCheck generator inside another generator

我有一个生成器可以创建一个非常复杂的对象。我不能通过类似

的方法创建这个对象
val myGen = for{
 a <- Gen.choose(-10,10)
 ...
} yield new MyClass(a,b,c,...)

我尝试了一种像这样创建自定义生成器的方法

val myComplexGen :Gen[ComplexObject] = {

  ...
  val myTempVariable = Gen.choose(-10,10)
  val otherTempVal = Gen.choose(100,2000)

  new MyComplexObject(myTempVariable,otherTempVal,...)
}

然后

test("myTest") {
  forAll(myComplexGen){ complexObj => 
        ... // Here, complexObj.myTempVariable is always the same through all the iterations
 }
}

虽然这有效,但生成的值始终相同。内部 Gen.choose 总是产生相同的值。

有什么方法可以让我用自己的逻辑编写自定义 Gen,并在里面使用内部 Gen.choose,那将是随机的?

我已经解决了这个问题。该解决方案绝对不优雅,但这是我解决问题的唯一方法。

我已将 myComplexGen 转换为 def,并在另一个 gen 中使用虚拟变量调用它

def myComplexGen :ComplexObject = {

  ...
  val myTempVariable = Gen.choose(-10,10)
  val otherTempVal = Gen.choose(100,2000)

  new MyComplexObject(myTempVariable,otherTempVal,...)
}

val realComplexGen :Gen[ComplexObject] = for {
    i <- Gen.choose(0,10) // Not actually used, but for cannot be empty
} yield myComplexGen()

现在我可以在 forAll 中使用 realComplexGen 并且对象真的是随机的。