ScalaCheck Arbitrary [T]和Scalacheck Gen [T]之间的区别

时间:2014-02-24 08:42:27

标签: scala scalacheck

在我的测试中,我正在广泛使用Specs2 + ScalaCheck,并且有一些模式可以分解。我仍然没有发现我的函数是否应该使用任意[T]或Gen [T],因为它们非常相似:

sealed abstract class Arbitrary[T] {
  val arbitrary: Gen[T]
}

函数签名是否会如此:

maxSizedIntervalArbitrary[A,B](implicit ordering:Ordering[A], genStart:Arbitrary[A], genEnd:Arbitrary[B]):Arbitrary[TreeMap[A,B]]

或者我应该在Gen抽象级别工作吗?

1 个答案:

答案 0 :(得分:3)

我会说两者兼得:

def maxSizedIntervalArbitrary[A,B](genStart:Gen[A], genEnd:Gen[B])(implicit ordering:Ordering[A]):Gen[TreeMap[A,B]]

implicit def maxSizedIntervalArbitrary[A,B](implicit ordering:Ordering[A], genStart:Arbitrary[A], genEnd:Arbitrary[B]):Arbitrary[TreeMap[A,B]] = 
  Arbitrary(maxSizedIntervalArbitrary(arbitrary[A], arbitrary[B]))
基本上,

Arbitrary用于提供隐式Gen,因此这允许使用具有显式forAll和隐式Gen的{​​{1}}变体。我不认为非Arbitrary implicit是有用的。