Todos nós temos algumas classes de utilitários, que contêm apenas métodos estáticos, para uso em diferentes fontes. Agora, pode haver duas abordagens que podem ser adotadas para testar esse trecho de código.
Abordagem 1:
Faça testes de unidade separados para classes de utilidade. Onde quer que estejam sendo chamados, zombe de sua interação usando alguma estrutura de teste que tem provisões para ela, como o PowerMock. Isso basicamente trata a classe de utilitário como um componente separado do sistema, que precisa ser testado e mantido individualmente.
Abordagem 2:
Não escreva testes de unidade para classes de utilidade. No entanto, os testes que são escritos para as outras classes principais que interagem com essa classe de utilitário permitem que essa interação ocorra, o que garantirá intrinsecamente que o código escrito nessa classe de utilitário seja testado adequadamente para diferentes casos de uso. Se algo quebrar, os testes para outros componentes devem ser capazes de capturá-lo.
Compartilhe seus pensamentos sobre qual abordagem é preferível ou se há alguma outra maneira pela qual as pessoas fazem isso.
Respostas:
Eu acho que há um grande mal-entendido sobre classes de 'utilidade' por aí. Só porque você torna uma classe 'estática', ela não a torna uma classe utilitária. Se sua classe de utilidade estática tiver dependências (que podem se manifestar em outras classes de 'utilidade' estáticas), ela introduzirá efeitos colaterais ou seu comportamento não poderá ser completamente controlado por suas entradas, não é uma classe de utilidade.
As verdadeiras classes de utilidade não precisam ser ridicularizadas porque sua saída é sempre determinística, dependendo de suas entradas.
O teste de unidade consiste em instanciar uma pequena parte do seu aplicativo (uma unidade) isoladamente, para que você possa (potencialmente) testar todos os caminhos de código nessa unidade. Mocking dependências atinge esse isolamento. Se uma classe de utilitário interrompe o isolamento, novamente não é uma classe de utilitário porque uma classe de utilitário deve ser isolada por definição.
Portanto, em um aplicativo nunca se deve querer ou ter que zombar de classes de utilidade. As classes que você sente que precisam ser ridicularizadas precisam ser transformadas em classes instantâneas de primeira classe e precisam ser passadas para a unidade como uma dependência (consulte Injeção de Dependências ). Essas dependências podem ser facilmente zombadas para que a unidade possa ser testada isoladamente.
fonte
Na minha opinião, é ridículo zombar de uma dependência de um método de utilidade estática para coisas como a divisão de cadeias.
Sim, se o método do separador estiver errado, poderá causar falhas espúrias nos testes de métodos que não tratam da divisão de cadeias. Mas esse não é o objetivo de uma suíte de testes. O conjunto de testes deve ter sucesso 100%, ponto final. Caso contrário, conserte o que está quebrado e repita até que ele tenha sucesso a 100%. Se a classe String Utility é quebrado, ele deve imediatamente causar uma falha em um teste que é sobre a funcionalidade string. Você corrige essa funcionalidade e todas as falhas desaparecem, para que você nunca precise examinar os casos de teste com falhas espúrias.
Em outras palavras, SIM, escreva testes para métodos utilitários. NÃO, não tente separá-los de outros testes. Simplesmente assuma que funções triviais de utilidade funcionam corretamente, conforme verificado por seus próprios testes. Fazer mais alguma coisa é mais esforço, sem nenhum ganho.
fonte