考虑这个例子:
case class Home(description: String)
case class Person(age: Int, race: String, home: Home)
def age(p: Person): Person = {
val newAge = p.age + 1
p.copy(age = newAge, home = if (newAge == 18) Home("Under the bridge") else p.home)
}
it("Should move on 18th birthday") {
val person18yrs = age(Person(17, "Caucasian", Home("With parents")))
person18yrs shouldBe Person(18, "Caucasian", Home("Under the bridge"))
}
现在,如果我想测试方法age
,我需要填写字段race
,即使方法age
没有根据person
对象进行区分这是比赛。它只是传递参数。在这个简单的例子中,它不是那么多工作,但是当我在20场类层次结构中使用两个字段时,我并不高兴。而且我想要快乐。所以我开始寻找解决方案。
一种解决方案可能是用空值填充空字段。但缺点是如果我然后更改实现,它会将测试类编译错误转换为测试失败。我仍然需要写这些空值。
另一个解决方案可能是创建方法,以便接受并返回与之交互的参数。缺点是我需要返回缺少名称的元组,或者我需要创建一些封装方法参数和返回类型的类。
也许堆栈溢出的聪明人确实有其他解决方案,我智力的半盲目眼睛看不到。 : - )
答案 0 :(得分:1)
创建一个完全填充的人作为原型,然后使用与您的特定测试用例相关的值创建副本。
val protoype = Person(16, "Caucasian", Home("With parents"))
val person18yrs = age(protoype.copy(age = 17))
答案 1 :(得分:0)
您可以定义与案例类名称相同但名称较少的工厂,并让它们创建您传递默认参数的相应对象,例如:
case class Person(age: Int, race: String, home: Home)
def Person(age: Int): Person = Person(age, "", Home(""))
对这些工厂的访问可能仅限于测试套件,以避免它们被用于应用程序的非休息相关代码。