In unserer Java-Codebasis sehe ich immer wieder folgendes Muster:
/**
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(...);
}
}
Was mich stört ist, dass ich von FooUtil
überall her eine Instanz bestehen muss , um zu testen.
- Ich kann die
FooUtil
Methoden nicht statisch machen, weil ich sie nicht zum Testen der beidenFooUtil
Klassen und ihrer Clientklassen verspotten kann . - Ich kann mit a keine Instanz von
FooUtil
am Ort des Verbrauchs erstellennew
, da ich sie zum Testen nicht verspotten kann.
Ich nehme an, meine beste Wette ist die Injektion (und das tue ich), aber es fügt seine eigenen Probleme hinzu. Wenn Sie mehrere util-Instanzen übergeben, wird auch die Größe der Methodenparameterlisten erhöht.
Gibt es eine Möglichkeit, besser damit umzugehen, die ich nicht sehe?
Update: Da die Utility-Klassen zustandslos sind, könnte ich wahrscheinlich ein statisches Singleton- INSTANCE
Member oder eine statische getInstance()
Methode hinzufügen , während die Möglichkeit erhalten bleibt, das zugrunde liegende statische Feld der Klasse zum Testen zu aktualisieren. Scheint auch nicht super sauber zu sein.
FooUtil
Methoden eingefügt werden FooSomething
, vielleicht gibt es Eigenschaften FooSomething
, die geändert / erweitert werden sollten, damit die FooUtil
Methoden nicht mehr benötigt werden. Bitte geben Sie uns ein konkreteres Beispiel dafür, was FooSomething
uns bei der Beantwortung dieser Fragen helfen kann.