9

在我的测试中,我对 Specs2 + ScalaCheck 进行了相当广泛的使用,并且有一些模式需要考虑。我还没有发现我的函数应该使用 Arbitrary[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抽象级别工作?

4

1 回答 1

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基本上,它用于提供隐式Gens,因此这允许将forAll变体与显式Gen和隐式一起使用Arbitrary。我不认为 non-implicit Arbitrary是有用的。

于 2014-02-24T09:34:42.947 回答