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、フィールドに入力する必要があります。パススルー パラメータのみです。この簡単な例では、それほど多くの作業は必要ありませんが、20 フィールドのクラス階層で 2 つのフィールドを扱うときは、満足できません。そして幸せになりたい。それで、私はいくつかの解決策を探し始めます。raceageperson

1 つの解決策は、空のフィールドを null で埋めることです。ただし、実装を変更すると、テストクラスのコンパイルエラーがテストの失敗に変換されるという欠点があります。そして、これらの null を記述する必要があります。

もう1つの解決策は、メソッドを作成して、対話するパラメーターを受け入れて返すことです。欠点は、名前のないタプルを返す必要があるか、メソッド パラメーターと戻り値の型をカプセル化するいくつかのクラスを作成する必要があることです。

あるいは、stackoverflow の賢い人たちは、私の知性の半盲の目では見ることができない、他の解決策を持っているのかもしれません。:-)

4

2 に答える 2

1

プロトタイプとして完全に入力された人物を 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(""))

これらのファクトリへのアクセスは、テスト スイートに限定して、アプリケーションのレストに関連しないコードで使用されることを避けることができます。

于 2013-06-14T15:37:04.857 に答える