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

时间:2019-04-15 07:29:02

标签: scala scalacheck

我有一个生成器,可以创建一个非常复杂的对象。我无法通过类似的方式创建该对象

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,那是随机的吗?

1 个答案:

答案 0 :(得分:0)

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

我已将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()

现在我可以在realComplexGen中使用forAll了,该对象实际上是随机的。