Ссылок на класс Dollar больше нет,
поэтому мы можем уд алить
этот класс. Од нако в только что написанном нами тесте есть од на
ссылка на класс Franc:
public void testDifferentClassEquality() {
assertTrue(new Money(10, "CHF"). equals(new Franc(10, "CHF")));
}
Если равенство объектов д о статочно хорошо протестировано
д ругими тестами, значит, мы можем безбоязненно уд алить этот тест.
Давайте взглянем на д ругие тесты:
public void testEquality() {
assertTrue(Money.dollar(5). equals(Money.dollar(5)));
assertFalse(Money.dollar(5). equals(Money.dollar(6)));
assertTrue(Money.franc(5). equals(Money.franc(5)));
assertFalse(Money.franc(5). equals(Money.franc(6)));
assertFalse(Money.franc(5). equals(Money.dollar(5)));
}
Похоже, что все возможные случаи
опред еления равенства
д о статочно полно охвачены д ругими тестами. Я д аже сказал бы, что
тестов слишком много. Мы можем уд алить третье и четвертое
выражение assert, так как они д ублируют первое и второе:
public void testEquality() {
assertTrue(Money.dollar(5). equals(Money.dollar(5)));
assertFalse(Money.dollar(5). equals(Money.dollar(6)));
assertFalse(Money.franc(5). equals(Money.dollar(5)));
}
$5 + 1 °CHF = $10, если курс обмена 2:1
$5 * 2 = $10
Сд елать переменную amount закрытым (private) членом
Побочные эффекты в классе Dollar?
Округление д енежных величин?
equals()
hashCode()
Равенство значению null
Равенство объектов
5 CHF * 2 = 1 °CHF
Дублирование Dollar/Franc
Общие операции equals()
Общие операции times()
Сравнение франков (Franc) и д олларов (Dollar)
Валюта?
Нужен ли тест testFrancMultiplication()?
Тест testDifferentClassEquality()
служит д оказательством того, что,
сравнивая объекты, мы сравниваем различные валюты, но не различные
классы. Этот тест имеет смысл только в случае, если в программе
существует несколько различных классов. Од нако мы уже избавились от
класса Dollar и намерены точно так же избавиться от класса Franc.
Иными словами, в нашем распоряжении
о станется только од ин
д енежный
класс:
Money.
С
учетом
наших
намерений,
тест
testDifferentClassEquality() оказывается д ля нас излишней обузой. Мы
уд алим его, а затем избавимся от класса Franc.
Обратите также внимание, что в программе присутствуют
отд ельные тесты д ля проверки умножения франков на д оллары. Если
заглянуть в код , можно увид еть, что на текущий момент логика метод а,
реализующего
умножение, не зависит от типа валюты (зависимо сть
была бы только в случае, если бы мы использовали д ва различных
класса). То есть мы можем уд алить функцию testFrancMultiplication(), не
опасаясь, что потеряем уверенно сть в правильно сти работы системы.
Итак, в нашем распоряжении ед иный д енежный класс, и мы готовы
приступить к реализации сложения.
Но сначала под вед ем итоги. В этой главе мы
• закончили потрошить производ ные классы и избавились от них;
•
уд алили тесты, которые имели смысл только при использовании
старой структуры код а, но оказались
избыточными в код е с новой
структурой.