在我的测试中,我正在广泛使用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
抽象级别工作吗?
答案 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
是有用的。