Экстремальное программирование. Разработка через тестирование | страница 44



if (from.equals(to)) return 1;

Integer rate = (Integer) rates.get(new Pair(from, to));

return rate.intValue();

}


Зеленая полоска!


$5 + 1 °CHF = $10, если курс обмена 2:1

$5 + $5 = $10

Операция $5 + $5 возвращает объект Money

Bank.reduce(Money)

Приведение объекта Money с одновременной конверсией валют

Reduce(Bank,String)


Далее мы переходим к нашему последнему, самому большому тесту, $5 + 1 °CHF. В данной главе мы применили несколько важных технологий:

• добавили параметр, который может нам понадобиться;

• удалили дублирование между кодом и тестами;

• написали тест (testArrayEquals), чтобы проверить порядок функционирования встроенной операции Java;

• создали вспомогательный закрытый (private) класс, не обладающий собственными тестами;

• допустили ошибку при рефакторинге и написали еще один тест, чтобы изолировать проблему.

8 Используя игру слов (английское change означает как «изменение», так и «обмен»), автор намекает на свою знаменитую книгу-бестселлер Extreme Programming Explained: Embrace Change. Русский перевод: Бек К. Экстремальное программирование. СПб.: Питер, 2002. 224 с. – Примеч. ред.

15. Смешение валют

$5 + 1 °CHF = $10, если курс обмена 2:1

$5 + $5 = $10

Операция $5 + $5 возвращает объект Money

Bank.reduce(Money)

Приведение объекта Money с одновременной конверсией валют

Reduce(Bank,String)


Теперь мы готовы написать тест, с которого все началось, – $5 + 1 °CHF:


public void testMixedAddition() {

Expression fiveBucks = Money.dollar(5);

Expression tenFrancs = Money.franc(10);

Bank bank = new Bank();

bank.addRate("CHF", "USD", 2);

Money result = bank.reduce(fiveBucks.plus(tenFrancs), "USD");

assertEquals(Money.dollar(10), result);

}


Именно такой код нам хотелось бы написать. К сожалению, мы сразу же получаем кучу ошибок компиляции. Обобщая код в процессе перехода от Money к Expression, мы оставили много висящих хвостов, на которые я, конечно же, обратил внимание, но решил вас не беспокоить. Теперь настало время заняться устранением дефектов.

Мы не сможем достаточно быстро обеспечить компиляцию предыдущего теста. Как только мы внесем в код первое изменение, нам потребуется внести в код еще изменения, и так далее. Теперь мы можем двигаться дальше одним из двух путей. Мы можем заставить тест работать быстро, для этого надо написать более специфичный тест и затем выполнить обобщение. Второй путь: довериться компилятору и с его помощью найти все ошибки. Давайте попробуем действовать медленно (на практике я внес бы в код все необходимые изменения за один раз).