#java #inheritance #junit #mockito #assert
#java #наследование #junit #mockito #утверждать
Вопрос:
У меня есть метод junit, который только вызывает super.method()
.
Что должно быть указано в junit для этого метода.
public String foo()
{
return super.foo();
}
Утверждает, что super.foo()
вызывается достаточно.
Или я также должен сравнить значения.
Комментарии:
1. Что вы тестируете?
2. Я пишу Junit. Мое намерение состоит в том, чтобы протестировать поведение И код, а также убедиться, что он имеет 100% покрытие, но я открыт для предложений.
Ответ №1:
Это интересный вопрос, и я сомневаюсь, что на него можно ответить без дополнительного контекста и понимания важности этого кода.
Если вы хотите отдать предпочтение изолированным тестам, то я бы сказал, что здесь мало что можно протестировать. Вместо этого я бы позаботился о том, чтобы super.foo()
было хорошо протестировано в тестовом классе для суперкласса. Преимущество этого подхода означает, что при изменении поведения суперкласса модульные тесты нуждаются в обновлении только в одном месте.
Однако, если для такого поведения есть веская бизнес-причина, то, возможно, имеет смысл протестировать эту реализацию и здесь. При тщательном повторном использовании кода в модульных тестах это минимизировало бы головную боль при обслуживании в дальнейшем.
По сути, выбор того, что и как тестировать этот метод, сводится к балансу между полнотой покрытия и стоимостью текущего обслуживания.
Ответ №2:
Если вызов super метода — это единственное, что делает этот метод, вам не обязательно создавать метод в первую очередь. Какой бы это ни был класс, он наследует все методы суперкласса, что означает, что вы можете вызывать foo()
без переопределения его.
Если это не единственное, что он делает, вы можете утверждать то же самое, что вы утверждаете в тесте junit для super метода.
Ответ №3:
Не тестируйте реализацию: протестируйте поведение. т.е., когда вы вызываете foo()
метод, делает ли он то, что должен делать?
Если только вызов super.foo()
не является частью контракта метода подкласса foo()
, что является почти запахом кода, но существуют тестовые фреймворки, которые могут специально утверждать, вызываются ли определенные методы. Мой любимый — Spock (не уверен в синтаксисе, потому что мне никогда не приходилось подтверждать вызовы super … еще одно свидетельство, хотя и анекдотическое, запаха кода. Если у вас метод только вызывает super.foo()
, удалите его и позвольте иерархии типов сделать это за вас.
Комментарии:
1. Не могли бы вы, пожалуйста, уточнить:
super.foo()
является частью контракта метода подклассаfoo()
.2. @FarrukhChishti Если java-документ метода гарантирует, что
super.foo()
это вызвано. Смотрите шаблон декоратора