У меня есть класс, который должен преобразовывать данные из одного формата в другой (Database to LibraryType). Он выглядит так:преобразователь класса test driven
public LibraryType convertToLibrary(Database db, Parameters params) {
Preconditions.checkNotNull(db," missing database for conversion");
Preconditions.checkNotNull(params, "missing parameters for conversion");
LibraryType lib = basicFactory.createLibraryType();
lib.setName(db.getName());
ComponentType type = convertStructure(db.getStructure(),params);
if (type != ComponentType.EMPTY) {
lib.addComponent(type);
}
return lib;
}
ComponentType convertStructure(Structure s, Parameters params) {
if (!params.isStructureAllowed(s)) return ComponentType.EMPTY;
ComponentType comp = basicFactory.createComponentType();
comp.setName(s.getName());
return comp;
}
У меня есть две проблемы с этой концепцией.
Метод convertStructure должен быть частным, потому что это не обязательно называть его с внешней стороны, но для целей тестирования я определил его пакет ширины, который не выглядит так красиво
В Параметрах (params) передаются в под-метод. На самом деле я бы использовал поле класса для того, которое можно было вставить во время конструктора, но из-за использования guice в качестве DI-framework я не могу передать эти данные в конструктор. Параметры будут меняться во время выполнения. Поэтому мне нужно передать его как параметр метода. Я могу установить его в поле класса в методе convertToLibrary, но тогда я не могу протестировать метод convertStructure.
Неужели я столкнулся с проблемой дизайна или есть какие-нибудь полезные обходные пути? Имеет ли смысл разделить его на разные классы, что звучит не так хорошо для меня, потому что я все еще чувствую, что это одна ответственность (SRP) в классе (преобразование данных)?
Спасибо за помощь
это не полный класс. В convertStructure произойдет еще один вызов, для преобразования подэлемента структуры и т. Д. Таким образом, в конце концов, может случиться так, что у вас будет 5 разных операторов if (в каждом методе может быть один), так что это увеличит количество методов тестирования – SimFirehawk
Это может случиться. Но, возможно, это не так. Способ TDD - это сделать то, что лучше всего на данный момент. Когда вы обнаружите новые вещи, измените/адаптируйте тестовый и/или производственный код к новым знаниям. –