JUnit - Testar método com retorno "void"  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
marcos.ribeiro
JavaChild

Membro desde: 23/12/2002 12:18:31
Mensagens: 146
Offline

Bom dia Pessoal,

Lendo alguns posts aqui do fórum, eu percebi que deveria começar a me preocupar mais com Unit Testing.
Trabalho em uma empresa pequena, onde tem apenas 2 programadores Java e outros PHP / Webdesigner, etc. Assim fica fácil fazer mudanças sem burocracia.

Ontem, eu e meu parceiro começamos a fazer alguns testes com JUnit + Mock object e realmente funcionaram como esperado.

Porém olhando o nosso código atual, existem vários métodos sem retorno (void), e são métodos importantes. Por exemplo:

Como podem ver no exemplo acima, eu tenho um método importante (efetuarCalculos()) que não tem retorno, na verdade ele pega os dados já definidos dentro do objeto nota, faz os calculos e armazena os valores dentro de atributos, que serão utilizados depois no método imprimirNota.

No caso acima, eu gostaria de testar o método efetuarCalculos sem usar o imprimirNota, porque o imprimirNota de fato, irá mandar dados para a impressora.

Alguem poderia me ajudar com esse problema?

Obrigado desde já pessoal
keller
GUJ Master
[Avatar]

Membro desde: 12/11/2003 16:24:00
Mensagens: 1817
Localização: Auckland - NZ
Offline

Espero que ajude:

http://junit.sourceforge.net/doc/faq/faq.htm#tests_4
http://forum.java.sun.com/thread.jspa?threadID=662501&messageID=3884797

Fazendo seu efetuarCalculos() "throws CalculoException" pode ser uma alternativa.


Guilherme I. Keller (Gui)
Diploma in Web Development and Desktop Publishing
SCJA | SCJP | SCWCD | SCBCD | CSM
"Test it, before it test you."
http://flickr.com/guikeller
[WWW] [MSN]
otaviofcs
Virtual Machine Man
[Avatar]

Membro desde: 21/12/2006 18:01:54
Mensagens: 511
Localização: Rio de Janeiro
Offline

Verifique se após executar os métodos, os atributos modificados estão com os valores desejados.

visite o blog da Riopro em:
http://blog.riopro.com.br

Aumente a capacidade de inovação na sua empresa usando o Zest:
http://zest.com.br

Conheça também:
http://votebolsa.com.br
[WWW]
marcos.ribeiro
JavaChild

Membro desde: 23/12/2002 12:18:31
Mensagens: 146
Offline

otaviofcs wrote:Verifique se após executar os métodos, os atributos modificados estão com os valores desejados.


A questão é que os atributos modificados são private e não pertencem a interface da classe, é utilizado apenas internamente.
otaviofcs
Virtual Machine Man
[Avatar]

Membro desde: 21/12/2006 18:01:54
Mensagens: 511
Localização: Rio de Janeiro
Offline

crie um método público get que retorne a/as variáveis. Ou mesmo substitua o toString da classe com os métodos em um encadeamento que você possa recuperar e avaliar o output

visite o blog da Riopro em:
http://blog.riopro.com.br

Aumente a capacidade de inovação na sua empresa usando o Zest:
http://zest.com.br

Conheça também:
http://votebolsa.com.br
[WWW]
s4nchez
Virtual Machine Man
[Avatar]

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

marcos.ribeiro wrote:
otaviofcs wrote:Verifique se após executar os métodos, os atributos modificados estão com os valores desejados.


A questão é que os atributos modificados são private e não pertencem a interface da classe, é utilizado apenas internamente.


Você tem ao menos 2 opções:
- Mudar atributos para protected e colocar a classe de teste no mesmo pacote da classe que está querendo testar
- Usar métodos que retornem valores para estes atributos

Ambas as soluções podem deixar seu código "menos bonito" do ponto de vista de OO, mas serão testáveis mais facilmente.

Ivan Sanchez | coding dojo | blog | twitter
[WWW]
Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline

Eu sou mais radical aqui.

A verdadeira beleza dos testes começa a aparecer quando você se obriga a testar o seu código. Percebeu que é difícil de testá-lo?

Isso indica um pequeno problema na sua classe. Perceba que quem usa a classe precisa se lembrar de chamar efetuaCalculo() antes de imprimirNota(). O que acontece se ele esquecer? Problema?

O teste te indicou um problema de design, justamente pq está difícil de testar. No seu lugar eu refatorava e juntava os dois métodos em um só.


Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?


http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
brunohansen
JavaEvangelist
[Avatar]

Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline

Fabio Kung wrote:

No seu lugar eu refatorava e juntava os dois métodos em um só.



Juntando os métodos eu não estaria acabando com a coesão do método?



[]s
Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline

De forma alguma, a responsabilidade pode continuar sendo dividida entre os dois. O ruim é obrigar quem usa a chamar métodos a mais só para "configurar" o seu objeto.


Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?


http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Concordo com o Fabio. Uma parte muito legal dos testes é que comecamos a perceber dependencias muito grandes, metodos com muita responsabilidade, classes estranhas, etc...

Se voce assumir uma postura de test driven desgin (nao precisa nem ser xiita de digitar o teste antes, mas SEMPRE ir fazendo os testes paralelamente), vai perceber que suas classes ja vao nascer mais desacopladas....

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Jair Rillo Junior
Moderador
[Avatar]

Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline

Deixa eu dar meu pitaco aqui.

Também concordo que no exemplo citado, o design da aplicação possa ser alterada para fazer mais sentido.

Porém, quebrando em vários métodos privates, como ficariam os testes? Um teste para o método "public" que internamente chama varios métodos privates, ou fazer um teste para cada método private? Se a segunda opçao for a correta, a melhor forma de testar um método private seria utilizando reflection entao?

Jair Rillo Junior

http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate
brunohansen
JavaEvangelist
[Avatar]

Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline

Interpretei mal quando vc disse:

Fabio Kung wrote:

No seu lugar eu refatorava e juntava os dois métodos em um só.







Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline

ManchesteR wrote:Porém, quebrando em vários métodos privates, como ficariam os testes? Um teste para o método "public" que internamente chama varios métodos privates, ou fazer um teste para cada método private? Se a segunda opçao for a correta, a melhor forma de testar um método private seria utilizando reflection entao?

Depende de cada caso Jair. Do jeito que está agora eu só testaria o método público. Mas se você perceber que os métodos privados estão com responsabilidades importantes e que é importante testá-los, refatora denovo , extrai o comportamento pra uma classe separada e testa a nova classe.

Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?


http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
Jair Rillo Junior
Moderador
[Avatar]

Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline

Show de bola Fábio, muito obrigado pelas dicas, alias, estou aprendendo bastante com esse tópico sobre JUnit.

Com essas e outras, começamos a notar como refatoramente é importante e necessário sempre.

Agora a pergunta do Marcos, acho que agora ficou claro para ele, como ele deve proceder , e eu daqui para frente irei prestar mais atenção na minha modelagem/implementação

Jair Rillo Junior

http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team