Nella nostra base di codice Java continuo a vedere il seguente modello:
/**
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(...);
}
}
Ciò che mi preoccupa è che devo passare un'istanza di FooUtilovunque, a causa dei test.
- Non posso rendere
FooUtilstatici i metodi, perché non sarò in grado di deriderli per i test di entrambeFooUtile delle sue classi client. - Non riesco a creare un'istanza
FooUtilnel luogo di consumo con anew, di nuovo perché non sarò in grado di deriderlo per i test.
Suppongo che la mia scommessa migliore sia usare l'iniezione (e lo faccio), ma aggiunge il suo set di problemi. Inoltre, il passaggio di più istanze util aumenta la dimensione degli elenchi di parametri del metodo.
C'è un modo per gestirlo meglio che non vedo?
Aggiornamento: poiché le classi di utilità sono senza stato, probabilmente potrei aggiungere un INSTANCEmembro singleton statico o un getInstance()metodo statico , pur mantenendo la possibilità di aggiornare il campo statico sottostante della classe per il test. Non sembra troppo pulito.
FooUtilmetodi dovrebbero essere messi in FooSomething, forse ci sono proprietà FooSomethingche dovrebbero essere modificate / estese in modo che i FooUtilmetodi non siano più necessari. Vi preghiamo di darci un esempio più concreto di cosa FooSomethingci può aiutare a fornire una buona risposta a queste domande.