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 FooUtil
ovunque, a causa dei test.
- Non posso rendere
FooUtil
statici i metodi, perché non sarò in grado di deriderli per i test di entrambeFooUtil
e delle sue classi client. - Non riesco a creare un'istanza
FooUtil
nel 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 INSTANCE
membro 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.
FooUtil
metodi dovrebbero essere messi in FooSomething
, forse ci sono proprietà FooSomething
che dovrebbero essere modificate / estese in modo che i FooUtil
metodi non siano più necessari. Vi preghiamo di darci un esempio più concreto di cosa FooSomething
ci può aiutare a fornire una buona risposta a queste domande.