В нашей кодовой базе Java я вижу следующий шаблон:
/**
This is a stateless utility class
that groups useful foo-related operations, often with side effects.
*/
public class FooUtil {
public int foo(...) {...}
public void bar(...) {...}
}
/**
This class does applied foo-related things.
*/
class FooSomething {
int DoBusinessWithFoo(FooUtil fooUtil, ...) {
if (fooUtil.foo(...)) fooUtil.bar(...);
}
}
Что меня беспокоит, так это то, что мне приходится проходить экземпляр FooUtilвезде, потому что тестирование.
- Я не могу сделать
FooUtilметоды статичными, потому что я не смогу имитировать их для тестирования обоихFooUtilклассов и их клиентов. - Я не могу создать экземпляр
FooUtilв месте потребления с помощьюnew, опять же, потому что я не смогу имитировать его для тестирования.
Я полагаю, что лучше всего использовать инъекцию (и я это делаю), но это добавляет свой набор неприятностей. Кроме того, передача нескольких экземпляров util увеличивает размер списков параметров метода.
Есть ли способ справиться с этим лучше, что я не вижу?
Обновление: поскольку служебные классы не сохраняют состояния, я мог бы, вероятно, добавить статический одноэлементный INSTANCEчлен или статический getInstance()метод, сохранив при этом возможность обновлять базовое статическое поле класса для тестирования. Тоже не кажется супер-чистым.
FooUtilметоды должны быть введены FooSomething, может быть, есть свойства, FooSomethingкоторые должны быть изменены / расширены, чтобы FooUtilметоды больше не нужны. Пожалуйста, дайте нам более конкретный пример того, как FooSomethingпомочь нам дать хороший ответ на эти вопросы.