В настоящее время я пытаюсь улучшить тестируемость устаревшей системы, написанной на Java. Наиболее существенная проблема - это наличие «внутренних» зависимостей, которые нельзя исключить. Решение этой проблемы довольно простое: введите внедрение зависимости.
К сожалению, кодовая база довольно большая, поэтому было бы огромным усилием внедрить внедрение зависимостей во всем приложении, вплоть до «начальной загрузки». Для каждого класса, который я хочу протестировать, мне нужно будет изменить еще сотню (может быть, я немного преувеличиваю здесь, но это определенно будет много) классов, которые зависят от измененного компонента.
Теперь к моему вопросу: было бы нормально использовать два конструктора, конструктор по умолчанию, который инициализирует поля экземпляра значениями по умолчанию, и еще один, чтобы разрешить внедрение зависимостей? Есть ли недостатки при использовании этого подхода? Это позволит внедрить зависимости для будущего использования, но все же не требует изменения существующего кода (несмотря на тестируемый класс).
Текущий код («внутренние» зависимости):
public class ClassUnderTest {
private ICollaborator collab = new Collaborator();
public void methodToTest() {
//do something
collab.doComplexWork();
//do something
}
}
С конструктором по умолчанию / di:
public class ClassUnderTest {
private ICollaborator collab;
public ClassUnderTest() {
collab = new Collaborator();
}
public ClassUnderTest(ICollaborator collab) {
this.collab = collab;
}
public void methodToTest() {
//do something
collab.doComplexWork();
//do something
}
}