W naszej bazie kodu Java wciąż widzę następujący wzorzec:
/**
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(...);
}
}
Niepokoi mnie to, że muszę zdać instancję FooUtil
wszędzie, ponieważ testowanie.
- Nie mogę uczynić
FooUtil
metod statycznymi, ponieważ nie będę w stanie wyśmiewać ich do testowania obuFooUtil
klas klienta. - Nie mogę utworzyć instancji
FooUtil
w miejscu konsumpcji za pomocąnew
, ponownie, ponieważ nie będę w stanie wyśmiewać jej do testów.
Przypuszczam, że moim najlepszym rozwiązaniem jest zastrzyk (i robię to), ale dodaje on własny zestaw problemów. Ponadto przekazanie kilku instancji użytkownika powoduje wzrost listy list parametrów metod.
Czy istnieje sposób, aby lepiej sobie z tym poradzić, czego nie widzę?
Aktualizacja: ponieważ klasy narzędzi są bezstanowe, prawdopodobnie mógłbym dodać statyczny INSTANCE
element singletonu lub getInstance()
metodę statyczną , zachowując możliwość aktualizacji podstawowego pola statycznego klasy do testowania. Nie wydaje się też super-czysty.
FooUtil
metody powinny zostać wprowadzone FooSomething
, może istnieją właściwości, FooSomething
które należy zmienić / rozszerzyć, aby FooUtil
metody nie były już potrzebne. Podaj nam bardziej konkretny przykład tego, co FooSomething
pomoże nam udzielić dobrej odpowiedzi na te pytania.