首页 > 解决方案 > 在另一个生成器中使用 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内部,那将是随机的?

标签: scalascalacheck

解决方案


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

我已经转变myComplexGen为 a 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在 a中使用,forAll并且对象真的是随机的。


推荐阅读