В нашей кодовой базе 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
помочь нам дать хороший ответ на эти вопросы.