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
FooUtilMethoden nicht statisch machen, weil ich sie nicht zum Testen der beidenFooUtilKlassen und ihrer Clientklassen verspotten kann . - Ich kann mit a keine Instanz von
FooUtilam 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- INSTANCEMember 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.
FooUtilMethoden eingefügt werden FooSomething, vielleicht gibt es Eigenschaften FooSomething, die geändert / erweitert werden sollten, damit die FooUtilMethoden nicht mehr benötigt werden. Bitte geben Sie uns ein konkreteres Beispiel dafür, was FooSomethinguns bei der Beantwortung dieser Fragen helfen kann.