Обычно я устанавливаю каждый атрибут класса как final (только для атрибутов, которые будут инициализированы внутри конструктора). Дело в том, что я сейчас реализую макет объекта для целей тестирования. Этот Mockup расширяет класс, который он издевается, и этот класс имеет некоторые конечные атрибуты. Поэтому я вынужден вызвать конструктор super() внутри конструктора объекта Mockup. Однако это разрушает полезность Mockup, потому что я не хочу, чтобы он инициализировал все атрибуты так, как это делает обычный класс. Я бы предпочел называть конструктор Mockup без вызова super() и делать все, что захочу.Расширение класса с конечными атрибутами. Mockup
Мой вопрос: целесообразно ли определять атрибуты как окончательные, если они заставят вас вызвать конструктор классов в макете?
EDIT: Я добавляю код. Проблема в этом случае заключается в том, что я использую синглтон, я знаю, что это не очень хорошая идея при тестировании, но в этом случае я не могу его изменить. Поэтому я намерен не называть этот метод в макете.
public class ReportsDataManager {
private final Map<String, List<String>> translations;
public ReportsDataManager() {
this.translations = GenericUtils.getTranslation();
}
}
Можете ли вы опубликовать код SUT и предполагаемый тест? Какова последовательность публичных вызовов/сообщений (когда они отправляются в тестируемый класс), что приведет к состоянию, требуемому для теста? Вам не нужно внешнее манипулирование частными переменными SUT. – Gishu
«но в этом случае я не могу его изменить». Измени это! ;) http://stackoverflow.com/questions/2925459/refactoring-singleton-overuse – flup
Как выглядит класс под тестом? Как он использует ReportDataManager? – flup