Mockear métodos privados  XML
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Autor Mensagem
alexswb
JavaChild
[Avatar]

Membro desde: 28/04/2006 11:46:26
Mensagens: 133
Offline

Tenho em uma classe um método público que chama vários métodos privados desta mesma classe.


public void metodoPrincipal (){
String resultado1 = metodoAuxiliar1 ();
String resultado2 = metodoAuxiliar2 ();
}

private void metodoAuxiliar1 (){....}

private void metodoAuxiliar2 (){....}

Estou usando reflection para testar cada um dos métodos privados. para testar o método principal eu gostaria de mockear estes métodos privados que já testei.

como eu faço isso?

estou usando o easy mock, mas não sei como mockear métodos privados.
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

alexswb wrote:Tenho em uma classe um método público que chama vários métodos privados desta mesma classe.


public void metodoPrincipal (){
String resultado1 = metodoAuxiliar1 ();
String resultado2 = metodoAuxiliar2 ();
}

private void metodoAuxiliar1 (){....}

private void metodoAuxiliar2 (){....}

Estou usando reflection para testar cada um dos métodos privados. para testar o método principal eu gostaria de mockear estes métodos privados que já testei.

como eu faço isso?

estou usando o easy mock, mas não sei como mockear métodos privados.


Não tem como.
Mas o seu problema é: teste os métodos públicos, não os privados.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
alexswb
JavaChild
[Avatar]

Membro desde: 28/04/2006 11:46:26
Mensagens: 133
Offline

é que a norma aqui na empresa é que eu tenha 100% do código coberto pelos testes, não importa se é método público ou privado.

mesmo que eu teste só os métodos publicos, todos os métodos privados devem ser cobertos.
se eu não testar um por um dos métodos privados, tenho que penar muito pra conseguir, pelos métodos publicos, atingir cada parte de código dos métodos privados que este método publico chama.

então tou testando isoladamente métodos privados antes. como demonstrado neste artigo:

http://www.artima.com/suiterunner/private3.html

mas preciso fazer com que o metodo publico seja testado depois. ai pensei em usar mocks. alguém tem outra alternativa?
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

alexswb wrote:mesmo que eu teste só os métodos publicos, todos os métodos privados devem ser cobertos.
se eu não testar um por um dos métodos privados, tenho que penar muito pra conseguir, pelos métodos publicos, atingir cada parte de código dos métodos privados que este método publico chama.


Mas essa não é uma boa oportunidade para se pensar bem nos casos de teste? E, eventualmente, testar se os métodos privados estão mesmo sendo chamados no momento certo?

This message was edited 1 time. Last update was at 18/01/2010 15:50:11


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
s4nchez
Virtual Machine Man
[Avatar]

Membro desde: 05/06/2006 11:35:55
Mensagens: 674
Localização: London, UK
Offline

alexswb wrote:
se eu não testar um por um dos métodos privados, tenho que penar muito pra conseguir, pelos métodos publicos, atingir cada parte de código dos métodos privados que este método publico chama.

então tou testando isoladamente métodos privados antes. como demonstrado neste artigo:

http://www.artima.com/suiterunner/private3.html

mas preciso fazer com que o metodo publico seja testado depois. ai pensei em usar mocks. alguém tem outra alternativa?


Se está tão difícil assim testar seus métodos privados isso provavelmente é sinal que o código não está muito bem estruturado. Se os seus métodos públicos dependem de muitos métodos privados pode ser que sua classe esteja com responsabilidades demais.

E os frameworks de mock não se preocupam com métodos privados porque você simplesmente não deveria precisar mocká-los.

Se você está mesmo penando para testar através dos métodos públicos, poste um exemplo que podemos tentar ajudar...

Ivan Sanchez | coding dojo | blog | twitter
[WWW]
alexswb
JavaChild
[Avatar]

Membro desde: 28/04/2006 11:46:26
Mensagens: 133
Offline

é que tanto os métodos privados como os públicos são relativamente complexos.
como eu tenho que atingir 100% de cobertura, fica complicado testar eles através de chamadas aos pelos métodos públicos. tenho que ficar re arranjando os dados, fica confuso e complexo. fora que quando da uma alteração por vezes eu acho mais fácil refazer todos os testes do que adaptar.
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

alexswb wrote:é que tanto os métodos privados como os públicos são relativamente complexos.
como eu tenho que atingir 100% de cobertura, fica complicado testar eles através de chamadas aos pelos métodos públicos. tenho que ficar re arranjando os dados, fica confuso e complexo. fora que quando da uma alteração por vezes eu acho mais fácil refazer todos os testes do que adaptar.


Vc sabe o que significa 100% de cobertura ? Significa que todas as linhas do seu codigo foram executadas por testes
Não significa que vc vai criar testes para todas as linhas do seu codigo.

100% de cobertura tem que ser alcançada por métodos publicos. Se uma linha do seu codigo privado não é possivel ser alcançada por nenhum teste dos métodos públicos provavelmente essa linha não faz falta.

Faça um refactoring , coloque esses métodos privados em outra classe e teste essa classe. Faça-os nivel de package e faça o teste pertencer ao mesmo package. Mas métodos privados vc nunca via conseguir testar e nem deve.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
alexswb
JavaChild
[Avatar]

Membro desde: 28/04/2006 11:46:26
Mensagens: 133
Offline

Mas se eu colocar os métodos privados em outra classe, o que muda?
Qual a diferença entre eu testar eles como estão agora, privados, e eu colocar estes métodos em uma classe separada e testá-los lá?
mario.fts
GUJ Ranger
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 817
Localização: São Paulo - ZL
Offline

se vc colocar em outra classe, e receber essa classe usando injeção de dependencia por exemplo, via construtor ou setter, vc pode mockear esse objeto, e passar para sua classe no momento do teste.

Mário Amaral Gonçalves

"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
[Email]
magnomp
JavaBaby

Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline

Dificuldade para testar é um bom indício de design ruim.

Se estes métodos privados são tão importantes e tão complexos, talvez eles deveriam estar em outras classes. Defina interfaces para abstrair essas classes e use injeção de dependencias para coloca-las no seu objeto.

E você pode sugerir à sua empresa rever essa política de 100% de cobertura. 100% de cobertura não significa que o sistema está livre de bugs.
 
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Ir para:   
Powered by JForum 2.1.8 © JForum Team