Nel nostro codebase Java continuo a vedere il seguente schema:
/**
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 dà fastidio è che devo passare un'istanza di FooUtil
ovunque, perché test.
- Non riesco a rendere statici i metodi di
FooUtil
, perché non sarò in grado di prenderli in giro per testare siaFooUtil
che le sue classi client. - Non riesco a creare un'istanza di
FooUtil
nel luogo di consumo connew
, anche perché non potrò prenderlo in giro per testare.
Suppongo che la mia migliore scommessa sia usare l'iniezione (e lo faccio io), ma aggiunge il suo insieme di problemi. Inoltre, il passaggio di più istanze utili aumenta la dimensione degli elenchi dei parametri del metodo.
C'è un modo per gestire meglio questo che non vedo?
Aggiornamento: poiché le classi di utilità sono stateless, potrei probabilmente aggiungere un membro statico INSTANCE
o un metodo getInstance()
statico, pur mantenendo la possibilità di aggiornare il campo statico sottostante di la classe per i test. Non sembra neanche troppo pulito.