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 FooUtil
todas partes, porque las pruebas.
- No puedo hacer que
FooUtil
los métodos sean estáticos, porque no podré burlarme de ellos para probar ambosFooUtil
y sus clases de cliente. - No puedo crear una instancia
FooUtil
en 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 INSTANCE
miembro 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.
FooUtil
métodos deberían ser incorporados FooSomething
, tal vez hay propiedades FooSomething
que deberían ser cambiadas / extendidas para que los FooUtil
métodos ya no sean necesarios. Danos un ejemplo más concreto de qué FooSomething
nos puede ayudar a dar una buena respuesta a estas preguntas.