Пример денег из TDD Кента Бека на примере - PullRequest
5 голосов
/ 10 октября 2011

Итак, я работал с примером Money в книге Кента Бека Test Driven Development на примере и смог заставить работать код до последнего написанного им теста:

@Test
public void testPlusSameCurrencyReturnsMoney(){
    Expression sum = Money.dollar(1).plus(Money.dollar(1));
    assertTrue(sum instanceof Money);
}

и вот функция, которая вызывает

public Expression plus(Expression addend) {
    return new Sum(this, addend);
}

Когда я запускаю это, он выдает java.lang.AssertionError, поэтому мой вопрос: почему он выдает эту ошибку и как мне ее исправить??

спасибо, и любая помощь приветствуется, и нет, это не для домашней работы ...

Ответы [ 2 ]

4 голосов
/ 07 декабря 2012

Lunivore уже ответил на вопрос, как решить проблему, но я думаю, что вам следует перечитать абзац непосредственно перед и после блока кода (и теста), если вы хотите понять больше о том, что Бек пыталсяпередать.

Последнее предложение гласит: «Вот код, который мы должны изменить, чтобы он работал:».Этот блок кода был впервые введен на странице 75 (с тестовым примером).Ничего не изменилось в конечном эффекте на странице 79. Это было просто указание на то, что мы могли бы изменить, если бы хотели сохранить этот тест.

"Не существует очевидного, чистого способа проверить валюту аргументаесли и только если это Деньги. Эксперимент проваливается, мы удаляем тест, и мы уходим ».

Он также заявил, что этот тест уродлив, и завершил на следующей странице« Пробовал короткий экспериментотменил, когда это не сработало ".

Я написал это на тот случай, если вы думаете, что все примеры просто работают и должны быть сохранены.

3 голосов
/ 10 октября 2011

Вы проверяете, что переменная sum является Money, но возвращает Sum в методе plus.

Таким образом, если Sum не является подклассом Money, это утверждение всегда будет неудачным.

Чтобы это прошло, вы можете сделать что-то вроде:

public Expression plus(Expression addend) {
    return new Money(...<whatever>...);
}

Конечно, тогда Money тоже должен быть Expression.

Или, возможно, вы захотите оценить sum, чтобы извлечь из него деньги. Или, может быть, даже сделать sum instanceof Sum вместо этого. Это зависит от того, какого поведения вы на самом деле пытаетесь достичь.

Кстати, остерегайтесь оператора instanceof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...