Я обнаружил, что во всех наших приложениях я все еще повторяю много кода, чтобы извлечь URL, имя пользователя, пароль и драйвер из context.xml
4 строки кода - это далеко-далеко от большого количества кода. Но если вы на самом деле копируете и вставляете этот класс во все свои приложения, то вам просто не следует этого делать Создайте отдельный проект, содержащий многоразовые проверки работоспособности, такие как этот, и создайте банку, и используйте эту банку в каждом приложении, которое нуждается в проверках работоспособности.
конструктор довольно грязный и не очень удобен для пользователя
Честно говоря, это не так грязно. Но это может быть менее беспорядочным, если вы не повторяете себя, все равно инициализируете приватные поля и если вы группируете сопоставимый код вместе:
public SqlHealthCheck (ServletContext context, String prefix) {
this.url = getParam(context, prefix, "db-url");
this.username = getParam(context, prefix, "db-user");
this.password = getParam(context, prefix, "db-password");
this.driver = getParam(context, prefix, "db-driver");
this.decodePassword();
setType("sqlcheck");
setDescription("SQL database check: " + this.url);
}
Будет ли модульное тестирование статическим методом трудным?
Нет. ServletContext - это интерфейс. Таким образом, вы можете создать свою собственную фальшивую реализацию или использовать фальшивый фреймворк. Затем вы можете просто вызвать конструктор фабричного метода, запустить проверку работоспособности и посмотреть, вернет ли он правильное значение.
Будут ли созданы копии ServletContext для каждого созданного мной SqlHealthCheck?
Конечно нет. Java передает ссылки на объекты по значению.
было бы лучше создать другой класс и передать только те значения, которые мне нужны?
Вы могли бы сделать это, но тогда логика получения значений из контекста сервлета будет просто в другом месте, и вам придется проверить это тоже, в основном так же, как вы проверяли бы этот класс.