1

考虑这个例子:

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 个字段的类层次结构中的两个字段时,我不高兴。我想要快乐。所以我开始四处寻找解决方案。

一种解决方案可能是用空值填充空字段。但不利的一面是,如果我随后更改实现,它会将测试类编译错误转换为测试失败。我仍然需要写这些空值。

另一种解决方案可能是只创建方法,以便它们接受并返回与之交互的参数。缺点是我需要返回元组,它缺少名称,或者我需要创建一些封装方法参数和返回类型的类。

或者,也许 stackoverflow 的聪明人确实有其他解决方案,我的智力的半盲眼是看不到的。:-)

4

2 回答 2

1

创建一个完全填充的人作为原型,然后使用与您的特定测试用例相关的值创建副本。

val protoype = Person(16, "Caucasian", Home("With parents"))
val person18yrs = age(protoype.copy(age = 17))
于 2013-06-14T18:01:20.290 回答
0

您可以定义与您的案例类同名但参数较少的工厂,并让它们创建您传递默认参数的相应对象,例如:

case class Person(age: Int, race: String, home: Home)

def Person(age: Int): Person = Person(age, "", Home(""))

对这些工厂的访问可能仅限于测试套件,以避免它们被用于您的应用程序的非 REST 相关代码中。

于 2013-06-14T15:37:04.857 回答