In scalacheck's user guide there is "Generating Case Classes" paragraph. I modified example from it to use regular classes instead of case classes:
import org.scalacheck._ import Gen._ import Arbitrary._ sealed abstract class Tree object Leaf extends Tree class Node(left:Tree, rigth:Tree, v:Int) extends Tree object Main { val genLeaf = value(Leaf) val genNode = for{ v <- Arbitrary.arbitrary[Int] left <- genTree rigth <- genTree } yield new Node(left, rigth, v) val genTree:Gen[Tree] = oneOf(genLeaf, genNode) def main(args:Array[String]){ println(genTree.sample) } } It seems everything working but I'm afraid of using this approach in production code before I ask here: is there any pitfalls?