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 FooUtiltodos os lugares, porque teste.
- Não consigo tornar
FooUtilos métodos estáticos, porque não poderei zombar deles para testar asFooUtilclasses de ambos e de seus clientes. - Não consigo criar uma instância
FooUtilno 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 INSTANCEmembro 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.
FooUtilmétodos devam ser colocados FooSomething, talvez haja propriedades FooSomethingque devam ser alteradas / estendidas para que os FooUtilmétodos não sejam mais necessários. Por favor, dê-nos um exemplo mais concreto do que FooSomethingnos ajudará a fornecer uma boa resposta para essas perguntas.