Na nossa base de código Java, continuo vendo o seguinte padrão:
/**
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(...);
}
}
O que me incomoda é que eu tenho que passar por uma instância de FooUtil
todos os lugares, porque teste.
- Não consigo tornar
FooUtil
os métodos estáticos, porque não poderei zombar deles para testar asFooUtil
classes de ambos e de seus clientes. - Não consigo criar uma instância
FooUtil
no local de consumo com anew
, novamente, porque não poderei zombar dela para teste.
Suponho que minha melhor aposta é usar a injeção (e eu uso), mas ela adiciona seu próprio conjunto de aborrecimentos. Além disso, a passagem de várias instâncias de utilidade aumenta o tamanho das listas de parâmetros do método.
Existe uma maneira de lidar com isso melhor que eu não estou vendo?
Atualização: como as classes de utilitário são sem estado, eu provavelmente poderia adicionar um INSTANCE
membro estático singleton ou um getInstance()
método estático , mantendo a capacidade de atualizar o campo estático subjacente da classe para teste. Também não parece super limpo.
FooUtil
métodos devam ser colocados FooSomething
, talvez haja propriedades FooSomething
que devam ser alteradas / estendidas para que os FooUtil
métodos não sejam mais necessários. Por favor, dê-nos um exemplo mais concreto do que FooSomething
nos ajudará a fornecer uma boa resposta para essas perguntas.