TL;DR
- 第 3 章で実装した
equalsを使い、テストを「$5 の 2 倍は $10 である」と読める形に書き直した。副次的に、テストコードと本番コードの結合度も下がった。 equalsが十分に検証されていないというリスクは残るが、TDD はそれを受け入れる。
内容
意図を語るテスト
それまでのテストは「$5 を 2 倍すると、amount フィールドは 10 である」と読める。これでは、times が Dollar を返すことが分かりにくい。
@Test
public void testMultiplication() {
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}第 3 章で実装した equals を使って次のように書き直すと、「$5 の 2 倍は $10 である」と読め、意図が明確になる。
@Test
public void testMultiplication() {
Dollar five = new Dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}TDD で受け入れるリスク
正しく検証できていないテストがあると、どうしようもない。たとえば、等価性比較が正しく実装されていることを検証していなければ、それを使う掛け算のテストも正しさを保証できない。実際、第 3 章では null や他のオブジェクトとの等価性比較を検証していない。
これは TDD で受け入れるべきリスクであり、本章ではそれを受け入れて equals をテストコードで使った。TDD は完璧な正しさを保証するものではなく、十分な自信を素早く得るための実践的な手法である。
キーワード
自分の理解
書き直す前のテストでも、変数を Dollar 型で宣言しているので、times が Dollar を返すことはそれなりに分かるとは思う。