Li alguns tópicos aqui sobre métodos estáticos e acho que entendo os problemas que o uso indevido / uso excessivo de métodos estáticos pode causar. Mas eu realmente não entendi por que é difícil zombar de métodos estáticos.
Sei que outras estruturas de simulação, como o PowerMock, podem fazer isso, mas por que o Mockito não pode?
Eu li este artigo , mas o autor parece ser religiosamente contra a palavra static
, talvez seja meu entendimento fraco.
Uma explicação / link fácil seria ótimo.
Respostas:
Acho que o motivo pode ser que as bibliotecas de objetos simulados normalmente criam zombarias criando classes dinamicamente em tempo de execução (usando cglib ). Isso significa que eles implementam uma interface em tempo de execução (é o que o EasyMock faz se não me engano) ou herdam da classe para zombar (é o que o Mockito faz se não me engano). Ambas as abordagens não funcionam para membros estáticos, pois você não pode substituí-los usando herança.
A única maneira de zombar de estática é modificar o código de byte de uma classe em tempo de execução, que eu suponho que seja um pouco mais envolvido do que herança.
Esse é o meu palpite, pelo que vale a pena ...
fonte
Se você precisar zombar de um método estático, é um forte indicador de um design ruim. Geralmente, você zomba da dependência de sua classe em teste. Se sua classe em teste refere-se a um método estático - como java.util.Math # sin, por exemplo - significa que a classe em teste precisa exatamente dessa implementação (de precisão versus velocidade, por exemplo). Se você deseja abstrair de uma implementação concreta do seio, provavelmente precisará de uma interface (você vê para onde isso vai dar)?
fonte
Eu realmente acho que é cheiro de código, se você precisar zombar de métodos estáticos também.
A única vez que isso parece exagero para mim, são bibliotecas como o Goiaba, mas você não precisa zombar desse tipo porque faz parte da lógica ... (coisas como Iterables.transform (..))
Dessa forma, seu próprio código permanece limpo, você pode zombar de todas as suas dependências de maneira limpa e possui uma camada anticorrupção contra dependências externas. Eu já vi o PowerMock em prática e todas as classes para as quais precisávamos eram mal projetadas. Além disso, a integração do PowerMock às vezes causava sérios problemas
(por exemplo, https://code.google.com/p/powermock/issues/detail?id=355 )
PS: O mesmo vale para métodos privados também. Eu não acho que os testes devam saber sobre os detalhes dos métodos privados. Se uma classe é tão complexa que tenta zombar de métodos privados, provavelmente é um sinal para dividi-la ...
fonte
@Inject SomeDependency
e na minha configuração eu definobind(SomeDependency.class).in(Singleton.class)
. Assim, se amanhã não for mais um Singleton, eu altero a configuração e pronto.Foo.getInstance()
toda parte. Acabei de escrever singleton na resposta para combater o argumento ", mas um método estático não requer a criação de muitos objetos wrapper". Também conceitualmente para mim, há pouca diferença entre um método estático e um método de instância em um singleton, apenas que você não pode zombar desse colaborador singleton. Mas singleton ou não não é absolutamente o ponto que eu estava tentando enfatizar, o objetivo é injetar e zombar de colaboradores e não chamar métodos estáticos se isso dificulta o teste.Mockito retorna objetos, mas estático significa "nível de classe, não nível de objeto". Portanto, o mockito dará exceção de ponteiro nulo para estática.
fonte
Em alguns casos, pode ser difícil testar métodos estáticos, especialmente se eles precisam ser ridicularizados, e é por isso que a maioria das estruturas de simulação não os suporta. Achei esta postagem do blog muito útil para determinar como zombar de métodos e classes estáticos.
fonte