У нашій кодовій базі 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нам допомогти, даючи хорошу відповідь на це питання.