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ę FooUtilwszędzie, ponieważ testowanie.
- Nie mogę uczynić
FooUtilmetod statycznymi, ponieważ nie będę w stanie wyśmiewać ich do testowania obuFooUtilklas klienta. - Nie mogę utworzyć instancji
FooUtilw 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 INSTANCEelement singletonu lub getInstance()metodę statyczną , zachowując możliwość aktualizacji podstawowego pola statycznego klasy do testowania. Nie wydaje się też super-czysty.
FooUtilmetody powinny zostać wprowadzone FooSomething, może istnieją właściwości, FooSomethingktóre należy zmienić / rozszerzyć, aby FooUtilmetody nie były już potrzebne. Podaj nam bardziej konkretny przykład tego, co FooSomethingpomoże nam udzielić dobrej odpowiedzi na te pytania.