Mockear métodos privados

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.

[quote=alexswb]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.
[/quote]

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

é 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?

[quote=alexswb]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. [/quote]

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?

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…

é 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.

[quote=alexswb]é 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. [/quote]

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.

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á?

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.

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.