У нашій кодовій базі 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
, знову ж таки, тому що я не зможу знущатися над ним для тестування.
Я вважаю, що найкращим моїм ставкою є використання ін'єкцій (і я це роблю), але це додає власний набір клопотів. Крім того, проходження декількох екземплярів утиліти збільшує розмір списків параметрів методу.
Чи є спосіб вирішити це краще, що я не бачу?
Оновлення: оскільки класи утиліти без стану, я, ймовірно, можу додати статичний однотонний INSTANCE
член або статичний getInstance()
метод, зберігаючи можливість оновлення базового статичного поля класу для тестування. Не здається надто чистою теж.
FooUtil
методи слід вводити FooSomething
, можливо, є властивості, FooSomething
які слід змінити / розширити, так що FooUtil
методи більше не потрібні. Надайте, будь ласка, конкретніший приклад того, що FooSomething
нам допомогти, даючи хорошу відповідь на це питання.