Создать тест Junit для метода Void - PullRequest
1 голос
/ 28 января 2020

Я изучаю модульное тестирование, у меня возникла путаница, у меня есть один метод Void. Не могли бы вы объяснить, как мне создать модульный тест для этого метода?

public void eat(Food food){

mAmountOfEatenFood += food.eatFood(mNeededAmountOfFood - mAmountOfEatenFood);
if(mAmountOfEatenFood == mNeededAmountOfFood){
    System.out.println(mName + " has eaten " + mAmountOfEatenFood + " and will not be hungry for a while..");
    mAmountOfEatenFood = 0;
    mIsHungry = false;  
}else{
    System.out.println(mName + " has eaten " + mAmountOfEatenFood + " and is still hungry..");
    System.out.println("Needs= " + mNeededAmountOfFood);
    mIsHungry = true;
}

}

1 Ответ

1 голос
/ 28 января 2020

Этот метод выглядит так, как будто он изменяет состояние вызывающего его объекта, скажем, объект называется 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.

...