Этот метод выглядит так, как будто он изменяет состояние вызывающего его объекта, скажем, объект называется FoodConsumer.
eat(Food)
изменяет состояние двух переменных (mAmountOfEatenFood
и mIsHungry
) .
Итак, чтобы узнать, нужно ли вам снова кормить этот объект, необходим метод получения для mIsHungry
. Было бы хорошо иметь геттер для mAmountOfEatenFood
.
«Очевидный» результат eat(Food)
- это если объект все еще голоден.
В тестовом методе вам необходим экземпляр FoodConsumer. Следовательно, позже после вызова eat(Food)
вы могли бы вызвать что-то вроде isMHungry()
и утверждать, является ли оно истинным или ложным. Кроме того, вы можете позвонить по номеру getMAmountOfEatenFood()
, чтобы проверить, имеет ли правильное значение после употребления недостаточного количества пищи, оцениваемое food.eatFood(....)
.
Для небольшого упрощения вы можете изменить eat(Food)
на логическое значение (даже для теста) и вернуть true / false сразу после установки того же значения для mIsHungry
.
Затем, некоторые маги c, которые мы не видим сейчас, происходят:
food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood)
Если это не какой-либо метод библиотеки, и у вас есть доступ к нему, тогда было бы хорошо иметь тесты, конвертирующие, если значение, возвращаемое eatFood
, хорошо.
Я не могу сказать точно (из-за волхвов c в eatFood
), но похоже, что есть в случае, раскрытом этим методом, что если FoodConsumer переедает (я думаю о некотором коэффициенте конверсии внутри eatFood
, который может превышать 1
).
Например, если neededFood
равно 100
и eatenFood
равно 90
, тогда 10
переходит к eatFood
, что умножает эту сумму на 5
. Таким образом, eatenFood
увеличивается на 50
, что приводит к 140
, который не равен amountOfNeededFood
.
. Простым исправлением будет просто изменить ваше if
условие на:
if(mAmountOfEatenFood >= mNeededAmountOfFood){
В конце давайте сравним этот случай с чем-то вроде repository.save(User)
.
Что-то похожее на repo.save(User)
- это метод void, имеющий только побочные эффекты.
Эти побочные эффекты не отображаются явно при вызове save
, но тогда repo
должен / должен содержать методы, которые могут возвращать некоторые значения, указывающие, было ли изменено внутреннее состояние repo
.
При тестировании хранилища, чтобы проверить, работает ли метод save
проверяемые утверждения проверяют, возвращает ли репозиторий то же число пользователей, которые были сохранены, и, например, содержит ли первый / второй / третий пользовательский объект те же значения объектов, которые использовались, когда save
.