En nuestra base de código Java sigo viendo el siguiente patrón:
/**
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(...);
}
}
Lo que me molesta es que tengo que pasar una instancia de FooUtiltodas partes, porque las pruebas.
- No puedo hacer que
FooUtillos métodos sean estáticos, porque no podré burlarme de ellos para probar ambosFooUtily sus clases de cliente. - No puedo crear una instancia
FooUtilen el lugar de consumo con anew, de nuevo porque no podré burlarme de ella para probarla.
Supongo que mi mejor opción es usar inyección (y lo hago), pero agrega su propio conjunto de problemas. Además, pasar varias instancias de utilidades infla el tamaño de las listas de parámetros del método.
¿Hay alguna manera de manejar esto mejor que no estoy viendo?
Actualización: dado que las clases de utilidad no tienen estado, probablemente podría agregar un INSTANCEmiembro singleton estático , o un getInstance()método estático , al tiempo que conserva la capacidad de actualizar el campo estático subyacente de la clase para la prueba. Tampoco parece súper limpio.
FooUtilmétodos deberían ser incorporados FooSomething, tal vez hay propiedades FooSomethingque deberían ser cambiadas / extendidas para que los FooUtilmétodos ya no sean necesarios. Danos un ejemplo más concreto de qué FooSomethingnos puede ayudar a dar una buena respuesta a estas preguntas.