<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8609407431841595653</id><updated>2012-02-16T18:59:11.912-08:00</updated><category term='JUnit Factory'/><category term='reflection'/><category term='foruns'/><category term='ant'/><category term='IoC'/><category term='static method'/><category term='escopo'/><category term='mock objects'/><category term='Teste de Recuperação'/><category term='Rails'/><category term='Selenium'/><category term='protected method'/><category term='Hibernate'/><category term='TestSuite'/><category term='ebook'/><category term='WebWork Action'/><category term='JUnit4'/><category term='Concrete Class'/><category term='private method'/><category term='eclEMMA'/><category term='JMockit'/><category term='testng'/><category term='JMock'/><category term='unit test'/><category term='Boas práticas'/><category term='BDD'/><category term='cglib'/><category term='Teste de Integração'/><category term='Teste de Regressão'/><category term='easy mock'/><category term='exception'/><category term='emma'/><category term='100% de Cobertura'/><category term='tdd'/><category term='comedias'/><category term='JUnit'/><category term='Spring'/><category term='Cruise Control'/><category term='Metodologias Ágeis'/><title type='text'>Think about Tests</title><subtitle type='html'>Pra testar e mockar, é só começar.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thinkabouttests.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-5007784825193877025</id><published>2009-03-30T01:00:00.000-07:00</published><updated>2009-03-30T06:04:36.192-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comedias'/><title type='text'>Apresentando FDD - Fear-Driven Development</title><content type='html'>Hoje lendo o &lt;a href="http://nerdson.com/blog/"&gt;blog do Nerdson&lt;/a&gt; (muito bacana), vi um negócio engraçado e que se tornou mais engraçado pelo fato de conhecer um caso real que usou esta técnica.&lt;br /&gt;&lt;br /&gt;Numa empresa que trabalhei anteriormente, tinha um brother recém-promovido à programador (Ou anapropégua* como preferir). Acontece que este carinha tinha um gerente super-star, que se parecia muito com o Dragãozinho do Nerdson.&lt;br /&gt;&lt;br /&gt;O pobre infeliz (do programador), estava com a corda no pescoço, com uns 3 projetos em atraso e 1 que tinha que terminar naquele mesmo dia, desta forma, 18:30 hs na mesa do programador estavam: O próprio, O "coordenador" dele, e o Gerente Super-Star.&lt;br /&gt;&lt;br /&gt;O pobre programador chegou a um momento de quase um AVC e choramingou: "Vou la fora dar uma respirada, e volto logo". O gerente então lasca: "Sente aí e quando você terminar, pode respirar!".&lt;br /&gt;&lt;br /&gt;Veja o &lt;a href="http://nerdson.com/blog/extreme/"&gt;Post do Nerdson&lt;/a&gt; para ter uma ilustração desta técnica incrível.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;*anapropégua = ANAlista, PROgramador e fí duma ÉGUA.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-5007784825193877025?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5007784825193877025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5007784825193877025'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2009/03/apresentando-fdd-fear-driven.html' title='Apresentando FDD - Fear-Driven Development'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4936647115871996778</id><published>2009-03-20T03:58:00.000-07:00</published><updated>2009-03-20T04:14:18.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cruise Control'/><title type='text'>Reparando uma injustiça com a Integração Automatizada.</title><content type='html'>A algum tempo atrás &lt;a href="http://thinkabouttests.blogspot.com/search/label/Cruise%20Control"&gt;crucifiquei&lt;/a&gt; o Sr. Cruise Control, na verdade não a ferramenta, mas o fato de automatizar esta integração. Porém, esses dias vi um novo cenário (que eu não tinha pensado) e que a automatização da Integração pode ser um GRANDE aliado.&lt;br /&gt;&lt;br /&gt;Imagine você que seu desenvolvimento esteja tão, ou simplesmente, evoluído o bastante para termos várias "formas" de testes automatizados. Imagine que um de seus testes seja algo como, apagar TODA uma base de dados, e popula-la novamente com os dados mais atuais da aplicação, e só depois executar uma bateria de testes automatizados.&lt;br /&gt;&lt;br /&gt;O bom e velho &lt;a href="http://improveit.com.br/xp/praticas/build_dez"&gt;Build de 10 minutos&lt;/a&gt; vai pra roça !!!&lt;br /&gt;&lt;br /&gt;Considere o exemplo acima apenas um EXEMPLO, pois podem existir várias situações em que sua integração ultrapasse, em muito, o tempo de 10 minutos.&lt;br /&gt;&lt;br /&gt;Resumindo, você deve ter "2 momentos" de integração:&lt;br /&gt;&lt;br /&gt;* A integração local: que seria a integração realizada em sua maquina, fazendo os testes unitários e, possivelmente, testes de integração;&lt;br /&gt;* E o momento da integração automatizada, que conta com todas as vantagens da ferramenta, como relatórios e afins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4936647115871996778?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4936647115871996778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4936647115871996778'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2009/03/algum-tempo-atras-crucifiquei-o-sr.html' title='Reparando uma injustiça com a Integração Automatizada.'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4785196513339664902</id><published>2008-10-17T07:04:00.000-07:00</published><updated>2008-10-17T07:47:07.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Um primeiro Teste Unitário em Ruby</title><content type='html'>&lt;a href="http://thinkinrails.wordpress.com/2008/10/17/um-primeiro-teste-em-ruby/"&gt;http://thinkinrails.wordpress.com/2008/10/17/um-primeiro-teste-em-ruby/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4785196513339664902?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4785196513339664902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4785196513339664902'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/10/um-primeiro-teste-unitrio-em-ruby.html' title='Um primeiro Teste Unitário em Ruby'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3834553123434491770</id><published>2008-09-13T18:40:00.000-07:00</published><updated>2008-09-13T18:48:55.107-07:00</updated><title type='text'>Novas atividades</title><content type='html'>Moçada,&lt;br /&gt;&lt;br /&gt;sei que estou meio ausente, e voltar a ativa com um post que não tem nada haver com o blog é desastroso, mas tenho um bom motivo:&lt;br /&gt;&lt;br /&gt;A mais de 2 meses venho estudando Ruby on Rails, direcionei todas as minhas atenções e horarios vagos para isso e estou percebendo que devo dedicar mais tempo ainda. Bem, o caso é que criei um novo &lt;a href="http://thinkinrails.wordpress.com/"&gt;blog pra falar sobre Ruby on Rails&lt;/a&gt;, e venho convidar a todos que se interessem pelo assunto a visita-lo. Bem, os assuntos que se relacionem com testes eu postarei nos 2 blogs, então se não se interessar por Rails, pode aguardar os posts sobre testes aqui mesmo.&lt;br /&gt;&lt;br /&gt;Até mais&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3834553123434491770?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3834553123434491770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3834553123434491770'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/09/novas-atividades.html' title='Novas atividades'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2794254765878585248</id><published>2008-06-05T07:20:00.000-07:00</published><updated>2008-06-05T07:25:56.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foruns'/><title type='text'>Fóruns que precisamos conhecer (Sobre Testes)</title><content type='html'>Em desenvolvimento, dúvidas são frequentes, por isso vou listar alguns lugares (Fóruns sobre teste e utilitários) que podemos encontrar soluções para os mais diversos problemas e mesmo encontrar respostas para nossas novas dúvidas.&lt;br /&gt;&lt;br /&gt;EclEMMA: &lt;a href="https://sourceforge.net/forum/forum.php?forum_id=614869"&gt;https://sourceforge.net/forum/forum.php?forum_id=614869&lt;/a&gt;&lt;br /&gt;EMMA: &lt;a href="http://sourceforge.net/forum/forum.php?forum_id=373865"&gt;http://sourceforge.net/forum/forum.php?forum_id=373865&lt;/a&gt;&lt;br /&gt;JMock: &lt;a href="http://www.jmock.org/mailing-lists.html"&gt;http://www.jmock.org/mailing-lists.html&lt;/a&gt;&lt;br /&gt;JMockit: &lt;a href="https://jmockit.dev.java.net/servlets/SummarizeList?listName=users"&gt;https://jmockit.dev.java.net/servlets/SummarizeList?listName=users&lt;/a&gt;&lt;br /&gt;JUnit: &lt;a href="http://www.nabble.com/JUnit-f2687.html"&gt;http://www.nabble.com/JUnit-f2687.html&lt;/a&gt;&lt;br /&gt;Selenium: &lt;a href="http://www.nabble.com/Selenium-f14083.html"&gt;http://www.nabble.com/Selenium-f14083.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;XP-Rio (Sobre práticas ágeis, TDD, outras formas de testar software): &lt;a href="http://tech.groups.yahoo.com/group/xprio/"&gt;http://tech.groups.yahoo.com/group/xprio/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2794254765878585248?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2794254765878585248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2794254765878585248'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/06/fruns-que-precisamos-conhecer.html' title='Fóruns que precisamos conhecer (Sobre Testes)'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-6172326974887254098</id><published>2008-06-05T06:26:00.000-07:00</published><updated>2008-06-05T06:32:54.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclEMMA'/><title type='text'>Resolvendo o problema do finally no EclEMMA</title><content type='html'>A algum tempo reclamei do meu colega EclEMMA &lt;a href="http://thinkabouttests.blogspot.com/2008/04/eclemma-e-seus-problemas-com-o-finally.html"&gt;aqui&lt;/a&gt;, acontece que fiz uma pergunta num &lt;a href="https://sourceforge.net/forum/message.php?msg_id=5008570"&gt;forum do produto&lt;/a&gt;, e mesmo com o meu inglês digno de um índio, obtive uma boa resposta:&lt;br /&gt; &lt;br /&gt;"&lt;span style="font-style: italic;"&gt;Hi, the yellow line is an artifact of the underlying coverage technology which&lt;/span&gt; &lt;span style="font-style: italic;"&gt;is based on byte code instrumentation. "Finally" statements only exist in Java &lt;/span&gt;&lt;span style="font-style: italic;"&gt;source code, the Java compiler creates corresponding control structured in byte &lt;/span&gt;&lt;span style="font-style: italic;"&gt;code. The finally block is actually executed in two different cases: In case&lt;/span&gt; &lt;span style="font-style: italic;"&gt;of normal execution and in case of an exception within the try block. You're&lt;/span&gt; &lt;span style="font-style: italic;"&gt;test code follows only one the these paths, therefor the line is marked yellow&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(partial execution).&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Muito bacana, dessa forma percebi que tenho que deixar o método disparar a exceção, caso ela aconteça, e tenho que verifica-la no método de teste.&lt;br /&gt;&lt;br /&gt;Usando o mesmo exemplo, eis a forma correta de testar e obter o resultado correto com o &lt;a href="http://thinkabouttests.blogspot.com/2007/12/emma-auxiliando-na-cobertura-de-testes.html"&gt;EclEMMA&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; StupidClass &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; falar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"try: "&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"oyeah!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; e&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"catch"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:    e&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;printStackTrace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:    &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throw&lt;/span&gt; e&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;16:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;finally&lt;/span&gt;&lt;br /&gt;17:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;18:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"ogou!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20:&lt;br /&gt;21:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"oh! fezes"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;22:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;23: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;e seu teste fica assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Assert&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;assertEquals&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Assert&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;assertNotNull&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Before&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Test&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestStupidClass &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:&lt;br /&gt;8:  StupidClass stupidClass &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; antes&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:   stupidClass &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; StupidClass&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14:&lt;br /&gt;15:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; falarTest&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Test 1"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; stupidClass&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;falar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"oh! fezes"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; exp &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21:&lt;br /&gt;22:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;23:    stupidClass&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;falar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; e&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;25:    exp &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; e&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;26:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;27:&lt;br /&gt;28:   assertNotNull&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Test 2"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; exp&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29:&lt;br /&gt;30:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;31: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Obrigado ao pessoal do EclEMMA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-6172326974887254098?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6172326974887254098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6172326974887254098'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/06/resolvendo-o-problema-do-finally-no.html' title='Resolvendo o problema do finally no EclEMMA'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1066436368263136306</id><published>2008-05-13T09:15:00.000-07:00</published><updated>2008-12-09T03:21:35.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boas práticas'/><category scheme='http://www.blogger.com/atom/ns#' term='Metodologias Ágeis'/><title type='text'>O que o cliente quer, o que você entrega</title><content type='html'>Essa figura é bem manjada, mas ilustra muito bem o que acontece com o desenvolvimento de software. As &lt;a href="http://pt.wikipedia.org/wiki/Desenvolvimento_%C3%A1gil_de_software"&gt;metodologias ágeis&lt;/a&gt; vieram ao mundo pra tentar reduzir essa distancia entre o que o "cliente quer" e o que você entrega, algumas práticas como &lt;a href="http://www.xpexchange.net/english/intro/smallReleases.html"&gt;Interações Curtas&lt;/a&gt; e Testes podem te ajudar a estar sempre mais próximo de atingir os seus objetivos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/SCnALmGmSvI/AAAAAAAAADs/MLxQICJTZ38/s1600-h/desenvolvimento_software.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/SCnALmGmSvI/AAAAAAAAADs/MLxQICJTZ38/s320/desenvolvimento_software.jpg" alt="" id="BLOGGER_PHOTO_ID_5199898550215265010" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1066436368263136306?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1066436368263136306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1066436368263136306'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/05/o-que-o-cliente-quer-o-que-voc-entrega.html' title='O que o cliente quer, o que você entrega'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4x-irBbGvFc/SCnALmGmSvI/AAAAAAAAADs/MLxQICJTZ38/s72-c/desenvolvimento_software.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8458684993653854977</id><published>2008-05-12T09:40:00.000-07:00</published><updated>2008-05-12T10:37:23.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teste de Recuperação'/><title type='text'>Teste de Recuperação</title><content type='html'>Depois de um email que me foi enviado pela &lt;a href="mailto:78betha@gmail.com"&gt;Roberta Laquini&lt;/a&gt;, questionando alguns assuntos, procurei saber um pouco sobre Testes de Recuperação, bem, nunca ouvi falar e depois que vi uma &lt;a href="http://www.zero-defect.com.br/pt/servicos/7/teste-de-recuperacao"&gt;fonte &lt;/a&gt;sobre o assunto percebi porque isso não é muito comum:&lt;br /&gt;&lt;br /&gt;"Avalia o comportamento do sistema após ocorrência de erro, sobrecarga ou condições anormais, como queda de luz e rede. Nestes testes são tipicamente simulados cenários inesperados da mesma forma que ocorrem nos ambientes reais, como a remoção forçada de um cabo de rede, o desligamento repentino da energia, etc."&lt;br /&gt;&lt;br /&gt;Imagina aí um cara desenvolvendo e indo debaixo da mesa puxar o cabo de força, mas é isso mesmo. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8458684993653854977?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8458684993653854977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8458684993653854977'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/05/teste-de-recuperao.html' title='Teste de Recuperação'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3745818538377390851</id><published>2008-05-07T06:58:00.000-07:00</published><updated>2008-05-07T07:02:30.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMockit'/><title type='text'>JMockit - RealMethodNotFoundForMockException</title><content type='html'>Existe um erro bem comum quando usamos &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html"&gt;JMockit&lt;/a&gt;: "&lt;span style="font-style: italic;"&gt;Corresponding real methods not found for the following mocks&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Por um erro, meu, de tradução, imaginava que esse erro devia-se a um método da classe real não estar sendo criado na minha classe Mock, quando li com calma hoje pela manhã, percebi que é o contrário, um método implementado na minha classe Mock não existe na classe real.&lt;br /&gt;&lt;br /&gt;Esse erro é comum de acontecer quando usamos uma classe de terceiro, normalmente empacotada num jar. No meu caso, tentava mockar a classe &lt;a href="http://kickjava.com/src/org/springframework/web/context/support/WebApplicationContextUtils.java.htm"&gt;WebApplicationContextUtils&lt;/a&gt; do &lt;a href="http://springframework.org/"&gt;Spring&lt;/a&gt; e tive que procurar o código fonte no google pra saber a assinatura do método.&lt;br /&gt;&lt;br /&gt;Percebi também que se você não criar o método falso para um método da classe real, ele vai invocar o método da classe real.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3745818538377390851?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3745818538377390851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3745818538377390851'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/05/jmockit-realmethodnotfoundformockexcept.html' title='JMockit - RealMethodNotFoundForMockException'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-5372446474133047056</id><published>2008-05-07T05:26:00.000-07:00</published><updated>2008-05-07T05:31:06.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concrete Class'/><category scheme='http://www.blogger.com/atom/ns#' term='cglib'/><title type='text'>Problema com o CGLIB</title><content type='html'>O &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas-2-misso.html"&gt;CGLIB&lt;/a&gt; foi descoberto quando procurávamos &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas.html"&gt;mockar classe concretas&lt;/a&gt; , ele é muito útil em muitas situações, principalmente quando usamos classes de outros. Acontece que esta semana descobrimos um probleminha nele: A classe que será mockada precisa do construtor default.&lt;br /&gt;&lt;br /&gt;O interessante é que ele executa o construtor default quando o método mock(Class) é invocado. Isso pode ser um problema, no meu caso, a classe é de terceiro e não tem o construtor default, mas acredito que o CGLIB vai continuar sendo a alternativa pra esse tipo de situação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-5372446474133047056?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5372446474133047056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5372446474133047056'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/05/problema-com-o-cglib.html' title='Problema com o CGLIB'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8258343705244033846</id><published>2008-05-05T12:54:00.000-07:00</published><updated>2008-05-05T13:58:32.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JUnit Factory'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><title type='text'>Send us code. Get back tests. Free.</title><content type='html'>Dica de pesquisa.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.igocoelho.com.br/"&gt;Igo&lt;/a&gt; deu uma dica de pesquisa bem interessante, como passei o dia tendo problemas com a rede e não consegui testar, envio a dica pra, caso alguém queira e tenha tempo, testar esse cara.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.junitfactory.com/"&gt;JUnitFactory&lt;/a&gt; promete gerar os testes para o seu código legado, com uma API de Mock Objects diferente das &lt;a href="http://thinkabouttests.blogspot.com/2007/12/quero-usar-mocks-uso-jmock-ou-easymock.html"&gt;mais populares&lt;/a&gt; de mercado, pode ser uma boa alternativa pra quem tem interesse em gerar grande quantidade de testes para código já existente.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.junitfactory.com/demo/"&gt;Aqui&lt;/a&gt; uma demonstração de como usar o &lt;a href="http://www.junitfactory.com/"&gt;JUnitFactory&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8258343705244033846?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8258343705244033846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8258343705244033846'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/05/send-us-code-get-back-tests-free.html' title='Send us code. Get back tests. Free.'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2464962858567834904</id><published>2008-04-24T14:01:00.000-07:00</published><updated>2008-04-24T14:04:00.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclEMMA'/><title type='text'>EclEMMA e seus problemas com o finally</title><content type='html'>Hoje tive a maior decepção do ano, logo com o &lt;a href="http://thinkabouttests.blogspot.com/2007/12/emma-auxiliando-na-cobertura-de-testes.html"&gt;EclEMMA&lt;/a&gt;, um plugin que tinha como extremamente confiável.&lt;br /&gt;&lt;br /&gt;Para ilustrar o problema vou fazer um exemplo bem simples (desculpem os termos usados, mas estou meio irritado com isso):&lt;br /&gt;&lt;pre&gt;0:&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; StupidClass &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; falar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"oyeah!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;finally&lt;/span&gt;&lt;br /&gt;10:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"ogou!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"oh! fezes"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;16:&lt;br /&gt;17: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;E seu teste:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Assert&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;assertEquals&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Before&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Test&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestStupidClass &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:&lt;br /&gt;7:  StupidClass stupidClass &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; antes&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:   stupidClass &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; StupidClass&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;15:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; blablabla&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;16:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;stupidClass&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;falar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"oh! fezes"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;18:&lt;br /&gt;19: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Para a minha infeliz surpresa, o corpo do finally não é considerado coberto, na verdade ele é "amarelado".&lt;br /&gt;Pra quem não sabe o que significa o amarelo ou verde ou vermelho, &lt;a href="http://www.eclemma.org/userdoc/annotations.html"&gt;veja aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Agora é buscar outra ferramenta que atenda essa necessidade, quando, e se, achar, posto aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2464962858567834904?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2464962858567834904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2464962858567834904'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/04/eclemma-e-seus-problemas-com-o-finally.html' title='EclEMMA e seus problemas com o finally'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4772444796789707982</id><published>2008-04-17T12:25:00.000-07:00</published><updated>2008-04-17T12:38:02.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='private method'/><category scheme='http://www.blogger.com/atom/ns#' term='protected method'/><title type='text'>Acessando um método não visível "na marra"</title><content type='html'>Um dia eu falei que um &lt;a href="http://thinkabouttests.blogspot.com/2007/12/como-testar-um-mtodo-privado.html"&gt;método privado deveria ser testado por intermédio de outro&lt;/a&gt;, já que se não existir um método que o chame, ele nem deve existir. Bem, hoje vi que não é verdade, ou pelo menos encontrei um caso que precisava implementar um método protected em uma classe que seria enviada como parâmetro para outro método.&lt;br /&gt;&lt;br /&gt;Aí pensei, "&lt;span style="font-style: italic;"&gt;tá na hora de sujar as mãos&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Como é possível que nem todos saibam usar &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/package-summary.html"&gt;Reflection&lt;/a&gt;, vou postar aqui o código para ajudar a quem precisar:&lt;br /&gt;&lt;br /&gt;Este é o método:&lt;br /&gt;&lt;br /&gt;protected PasswordAuthentication getPasswordAuthentication()&lt;br /&gt;{&lt;br /&gt; return new PasswordAuthentication(mailSender.getUsername(), mailSender.getPassword());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;e assim o acesso:&lt;br /&gt;&lt;br /&gt;public void testGetPasswordAuthentication() throws Exception{&lt;br /&gt; Method metodo = authenticatorImpl.getClass().getDeclaredMethod( "getPasswordAuthentication", new Class[]{});&lt;br /&gt; metodo.setAccessible(true);&lt;br /&gt; metodo.invoke(authenticatorImpl, new Object[]{});&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4772444796789707982?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4772444796789707982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4772444796789707982'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/04/acessando-um-mtodo-no-visvel-na-marra.html' title='Acessando um método não visível &quot;na marra&quot;'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2295324035421911383</id><published>2008-04-17T05:44:00.000-07:00</published><updated>2008-04-17T05:50:20.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Boas práticas'/><title type='text'>Boas práticas - Parte II</title><content type='html'>Uma boa prática que tenho percebido ajudar muito na análise de testes, é o uso do parâmetro (message) do tipo String que todos os &lt;a href="http://junit.sourceforge.net/javadoc/junit/framework/Assert.html"&gt;asserts&lt;/a&gt; do &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; suportam.&lt;br /&gt;Desta forma indico que sempre este parâmetro seja utilizado.&lt;br /&gt;&lt;br /&gt;Exemplos:&lt;br /&gt;assertEquals("Test 1", true, true);&lt;br /&gt;assertTrue("Test 2", false);&lt;br /&gt;assertNotNull("Test 3", new Object());&lt;br /&gt;&lt;br /&gt;e todos os outros &lt;a href="http://junit.sourceforge.net/javadoc/junit/framework/Assert.html"&gt;asserts&lt;/a&gt; se comportam da mesma forma.&lt;br /&gt;&lt;br /&gt;O erro aparecerá assim: &lt;span style="font-weight: bold;"&gt;junit.framework.AssertionFailedError: Test 2&lt;/span&gt;&lt;br /&gt;Indicando onde o erro aconteceu.&lt;br /&gt;&lt;br /&gt;Numa classe de testes onde você tenha muitos assert é quase impossível, ou no mínimo complicado, encontrar em que assert o teste falhou.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2295324035421911383?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2295324035421911383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2295324035421911383'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/04/boas-prticas-parte-ii.html' title='Boas práticas - Parte II'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3030835216347854854</id><published>2008-04-02T08:51:00.000-07:00</published><updated>2008-04-02T08:56:01.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><title type='text'>BDD - Mais uma técnica de programação?</title><content type='html'>Behaviour Driven Development é algo que, atualmente, se ouve bastante no meio Ágil, e lendo um &lt;a href="http://dojofloripa.wordpress.com/2006/10/"&gt;artigo&lt;/a&gt; do &lt;a href="http://isanchez.net/"&gt;Ivan Sanchez&lt;/a&gt; sobre o assunto, vejo que não existem diferenças "em termos de técnica de programação" entre BDD e TDD (Test Driven Development), aparentemente o BDD foi criado para substituir conceitualmente o TDD, pois o termo Test pode ser (e é) facilmente confundindo com Validação e causa uma certa distância entre nós e os humanos normais (não-desenvolvedores).&lt;br /&gt;&lt;br /&gt;Segundo o &lt;a href="http://behaviour-driven.org/"&gt;Portal do BDD&lt;/a&gt;, esta técnica é a evolução "lógica" do TDD e do Acceptance Test Driven Planning. BDD têm um vocabulário que pode ser utilizado por todos os interessados: empresa, desenvolvedores, testadores, analistas e gerentes. Este vocabulário é tido como o "grande bum" do BDD.&lt;br /&gt;&lt;br /&gt;BDD é mais rico que TDD quando pensamos em ferramentas, pois existe um conjunto de frameworks que auxilia na sua implementação, para Java o mais famoso (e o único que eu conheço) é o &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Vejo BDD como uma idéia bem bacana e que merece ser experimentada, os depoimentos que escuto são sempre positivos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3030835216347854854?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3030835216347854854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3030835216347854854'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/04/bdd-mais-uma-tcnica-de-programao.html' title='BDD - Mais uma técnica de programação?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1003402677256087275</id><published>2008-04-02T08:26:00.000-07:00</published><updated>2008-04-02T12:53:36.317-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='Boas práticas'/><title type='text'>Desacoplando para melhorar o design e facilitar os testes</title><content type='html'>Usando &lt;a href="http://thinkabouttests.blogspot.com/search/label/tdd"&gt;TDD,&lt;/a&gt; normalmente nos deparamos com situações em que precisamos mudar nossa implementação para atender a algum teste, isso é &lt;a href="http://thinkabouttests.blogspot.com/2008/01/testes-dirigem-o-design.html"&gt;normal&lt;/a&gt; e viável, já que os testes são parte do sistema.&lt;br /&gt;&lt;br /&gt;Quando o &lt;a href="http://www.caelum.com.br/caelum/instrutores.jsp"&gt;Paulo Silveira&lt;/a&gt; veio a Fortaleza e ministrou um workshop sobre Java, &lt;a href="http://thinkabouttests.blogspot.com/2008/02/melhorando-o-design-da-aplicao-e.html"&gt;falou-se &lt;/a&gt;muito sobre desacoplar, não usar métodos estáticos (sempre que possível) e outras boas práticas como &lt;a href="http://today.java.net/pub/a//today/2004/02/10/ioc.html"&gt;IoC&lt;/a&gt;, acontece que venho buscando sempre soluções pra esses casos sem mudar minha implementação, na maioria até consegui, lógico que com maior dificuldade e esforço.&lt;br /&gt;&lt;br /&gt;Assim, esta semana discutimos a implementação de alguns testes que estavam muito complicados e ví que o que o Paulo havia falado era bem simples, ao menos da maneira que solucionamos o problema. Vou ilustrar com um exemplo bem simples pra deixar claro como podemos facilitar os testes desacoplando algumas coisas.&lt;br /&gt;&lt;br /&gt;Primeiro quero dizer que com um Spring da vida você não vai precisar usar esse artifício, pois com o IoC do Spring você pode fazer isso;&lt;br /&gt;Segundo, é importante ficar atento, porque se existirem muitas dependência, um artifício simples como esse pode não funcionar.&lt;br /&gt;&lt;br /&gt;Ao exemplo:&lt;br /&gt;&lt;br /&gt;Tenho 3 classes.&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseA &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; metodo1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:         ClasseB classeB &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseB&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:         classeB&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;metodo2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseB &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; metodo2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:         &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;m1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:&lt;br /&gt;4:         ClasseUtil classeUtil &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:         &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;classeUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;m2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:     &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseUtil &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; m1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"m1"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; m2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"m2"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;No teste da ClassseB terei algumas dificuldades porque existe uma chamada a um método estático (podemos usar &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html"&gt;JMockit&lt;/a&gt;, porém, dependendo do retorno, torna-se uma tarefa muito complicada) e um instanciamento da ClasseUtil.&lt;br /&gt;&lt;br /&gt;Como poderíamos evitar isso? Bem simples:&lt;br /&gt;&lt;br /&gt;Passaremos a instância da ClasseUtil como parâmetro do método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseA &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; metodo1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:   ClasseB classeB &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseB&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:   classeB&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;metodo2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseB &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; metodo2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;ClasseUtil classeUtil&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;classeUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;m1&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;System&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;out&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;println&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;classeUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;m2&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O design fica bem simples e os testes mais fáceis de implementar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1003402677256087275?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1003402677256087275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1003402677256087275'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/04/desacoplando-para-melhorar-o-design-e.html' title='Desacoplando para melhorar o design e facilitar os testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1373018038737857432</id><published>2008-03-17T04:50:00.000-07:00</published><updated>2008-03-17T04:59:33.066-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>Devo mockar métodos de classes "utilitárias"?</title><content type='html'>Se considerarmos que esses métodos estão fora do escopo testado ou que serão testados isoladamente, a resposta é não, porém, pensando com cuidado, percebo que esses métodos normalmente são recheados de &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/package-summary.html"&gt;Reflections &lt;/a&gt;e &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html"&gt;Generics &lt;/a&gt;para serem o mais genérico possível, e pensando em algumas situações acho que podemos mudar de opinião.&lt;br /&gt;&lt;br /&gt;Temos aqui na &lt;a href="http://www.fortesinformatica.com.br/"&gt;empresa&lt;/a&gt; uma classe CollectionUtil onde criamos métodos para manipular &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html"&gt;Collections&lt;/a&gt;. Nesta classe criamos um método não tão genérico quanto o possível, porém, o suficiente para a nossa utilização, sendo que me deparei com uma coisa:&lt;br /&gt;&lt;br /&gt;O método é responsável por receber uma Collection e retornar um Array de ids (todas as nossas entidades tem esse atributo):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; Long[] convertCollectionToArrayIds(&lt;br /&gt;1:   Collection&lt;t&gt; coll)&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Method&lt;/span&gt; mKey &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Long&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt; ids &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Long&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;coll&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;size&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:   &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; count &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;T clazz&lt;span style="color: rgb(128, 128, 48);"&gt;:&lt;/span&gt; coll&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;10:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:    mKey   &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; clazz&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getClass&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;12:     getMethod&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"getId"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:    ids&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;count&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Long&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; mKey&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;invoke&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;14:      clazz&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Object&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:    count&lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; ids&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; e&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;21:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;22:   e&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;printStackTrace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;23:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;25: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/t&gt;&lt;/pre&gt;&lt;br /&gt;Imagine uma situação onde alguém, não importa o porque, não use o atributo "id" e sim "cod" ou um erro de digitação e sai um "ide", ou qualquer outra coisa, pensando nisso, vejo que a melhor saída é: Não mockar o método "utilitário".&lt;br /&gt;&lt;br /&gt;Use o bom senso, um método utilitário que envie um email ou que não seja tão genérico assim, pode ser mockado. Outra alternativa é enriquecer o método "utilitário", fazendo verificações se a entidade possui o atributo "id".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1373018038737857432?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1373018038737857432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1373018038737857432'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/03/devo-mockar-mtodos-de-classes.html' title='Devo mockar métodos de classes &quot;utilitárias&quot;?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1106278393894727859</id><published>2008-03-11T04:44:00.000-07:00</published><updated>2008-03-11T04:46:30.058-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='100% de Cobertura'/><title type='text'>Mais sobre Cobertura de Código (Code Coverage)</title><content type='html'>Mais uma vez caí numa discussão sobre garantir ou não 100% de cobertura, na ultima vez que discuti o assunto caí num ponto onde 100% de Cobertura só serve para o marketing da minha empresa, ou setor ou de um produto, de qualquer forma, somente para Propaganda.  Acontece que algumas coisas foram mudando minha opinião, e achei que deveria atualizar a opinião do Blog também.&lt;br /&gt;&lt;br /&gt;* Sem garantir os 100% de Cobertura, fica complicado verificar se o que deve ser testado, foi testado. O responsável, ou toda a equipe tem que ficar constantemente verificando a cobertura de uma determinada classe ou de um determinado pacote;&lt;br /&gt;* Alterações em um método que não deveria ser testado fazem com que ele precise de teses. Num "getzinho" simples que só retorna uma data, você pode incluir um regra que: se não houver data no objeto, retorne a data de hoje. Se o desenvolvedor esquecer de fazer o teste, dificilmente alguém vai perceber a ausência dele;&lt;br /&gt;* Num momento de refactoring, a confiança nos testes fica abalada. Se você não sabe se todo o sistema esta coberto, como você vai garantir que suas alterações não quebraram o código? Resposta fácil, procurando a classe de testes responsável pelo método que esta sendo refatorado e verificando se existe algum teste para aquele método específico.&lt;br /&gt;&lt;br /&gt;Quando pensamos em todos esses pontos, e percebemos outros como o que vi no &lt;a href="http://wagnerelias.com/2006/10/19/code-coverage/"&gt;Blog do Wagner Elias&lt;/a&gt;, ótimo texto por sinal, percebemos que garantir a cobertura de código é muito válido, não somente a nível de Propaganda.&lt;br /&gt;&lt;br /&gt;Uma alternativa muito boa é automatizar alguns testes, ou gerar o código das situações mais genéricas, prefira sempre a primeira situação, manter código desnecessário é um custo muito alto. Sendo assim, um get ou set estaria sendo coberto por esse teste genérico, até ter sua implementação alterada, neste caso um teste "de verdade" seria criado para ele.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://thinkabouttests.blogspot.com/search/label/100%25%20de%20Cobertura"&gt;Para ver os outros post sobre o assunto.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1106278393894727859?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1106278393894727859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1106278393894727859'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/03/mais-sobre-cobertura-de-cdigo-code.html' title='Mais sobre Cobertura de Código (Code Coverage)'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2899757757306838717</id><published>2008-03-06T10:19:00.000-08:00</published><updated>2008-03-06T10:28:49.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>Método mockado retornando uma Exception</title><content type='html'>Recentemente precisei fazer um teste em um método e que deveria verificar o comportamento do mesmo quando um método invocado por ele retornasse uma Exception específica.&lt;br /&gt;&lt;br /&gt;Exemplo do método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; String delete() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:   vendaManager&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;delete&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;venda&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;UnexpectedRollbackException e&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:   addActionError&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Não foi possível cancelar venda."&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; Action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;INPUT&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; Action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;SUCCESS&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;No expect do método é só retornar a exception da seguinte forma:&lt;br /&gt;&lt;pre&gt;0: vendaManager.expects(once()).method("delete")&lt;br /&gt;1:  .with(ANYTHING).will(throwException(&lt;br /&gt;2:    new UnexpectedRollbackException("")))&lt;span style="color: rgb(128, 128, 48);"&gt;;&lt;/span&gt;&lt;br /&gt;3: assertEquals(action.delete(), "input")&lt;span style="color: rgb(128, 128, 48);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2899757757306838717?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2899757757306838717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2899757757306838717'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/03/mtodo-mockado-retornando-uma-exception.html' title='Método mockado retornando uma Exception'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3777070249667522251</id><published>2008-02-28T12:58:00.000-08:00</published><updated>2008-12-09T03:21:35.766-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='Teste de Integração'/><title type='text'>Descobrindo o Selenium</title><content type='html'>Selenium é a ferramenta mais utilizada para &lt;a href="http://thinkabouttests.blogspot.com/2008/02/teste-de-integrao.html"&gt;Testes de Integração&lt;/a&gt;, ou ao menos a mais popular no meio Java.&lt;br /&gt;&lt;br /&gt;Para os nossos exemplos, vamos usar o plugin para o FireFox que facilita muito a tarefa (Uma lista de links importantes esta no final do post, incluindo downloads de plugins e ferramentas).&lt;br /&gt;&lt;br /&gt;O Selenium tem o seu próprio testRunner, porém nós vamos utilizar o Selenium-RC para testarmos via código Java, isso possibilita integrar os testes de Selenium com seus Testes Unitários.&lt;br /&gt;&lt;br /&gt;Com o plugin do FireFox, iniciamos a usar o Selenium:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R8chEAe-b4I/AAAAAAAAAC4/NZZKDmFEnkY/s1600-h/usando+o+plugin+do+firefox.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R8chEAe-b4I/AAAAAAAAAC4/NZZKDmFEnkY/s320/usando+o+plugin+do+firefox.JPG" alt="" id="BLOGGER_PHOTO_ID_5172139049791418242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Começamos a gravar o processo que queremos testar, no caso um simples login:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4x-irBbGvFc/R8chMge-b5I/AAAAAAAAADA/F-NSsjVdvXQ/s1600-h/comecando+a+gravar.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://2.bp.blogspot.com/_4x-irBbGvFc/R8chMge-b5I/AAAAAAAAADA/F-NSsjVdvXQ/s320/comecando+a+gravar.JPG" alt="" id="BLOGGER_PHOTO_ID_5172139195820306322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Quando completamos o processo que queremos testar, paramos a gravação:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4x-irBbGvFc/R8chZQe-b6I/AAAAAAAAADI/T4iTXmsDEZU/s1600-h/parando+a+gravacao.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://1.bp.blogspot.com/_4x-irBbGvFc/R8chZQe-b6I/AAAAAAAAADI/T4iTXmsDEZU/s320/parando+a+gravacao.JPG" alt="" id="BLOGGER_PHOTO_ID_5172139414863638434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Exportamos o teste feito para código Java:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R8chhAe-b7I/AAAAAAAAADQ/g9CJFQxRn7g/s1600-h/exportando+para+java.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R8chhAe-b7I/AAAAAAAAADQ/g9CJFQxRn7g/s320/exportando+para+java.JPG" alt="" id="BLOGGER_PHOTO_ID_5172139548007624626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O código gerado é esse:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; com&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;thoughtworks&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;selenium&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; java&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;util&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;regex&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Pattern&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; login &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;extends&lt;/span&gt; SeleneseTestCase &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testLogin&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;5:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;open&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"/login.action;"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;6:    &lt;span style="color: rgb(0, 0, 230);"&gt; "jsessionid=21FC72563"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;7:     &lt;span style="color: rgb(0, 0, 230);"&gt;"78F1D482601E23C929635A1"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;type&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"j_password"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"1234"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;click&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"submit"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;waitForPageToLoad&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"30000"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Área Inacessível"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;12:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getAlert&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O objeto selenium no método acima, nos da informações da página, como um alert, tempo esperado para a página carregar, o titulo, dentre outras coisas.&lt;br /&gt;&lt;br /&gt;Para que o teste fique completo, estendemos TestCase, declaramos um atributo selenium do tipo Selenium e criamos o setUp e tearDown:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void setUp() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; url &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;br /&gt;2:   &lt;span style="color: rgb(0, 0, 230);"&gt;"http://www.meuslivroseletronicos.com.br"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  selenium &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; DefaultSelenium&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"localhost"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;4:    SeleniumServer&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getDefaultPort&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;5:    &lt;span style="color: rgb(0, 0, 230);"&gt;"*firefox"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; url&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;start&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;protected&lt;/span&gt; void tearDown() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;10:  selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;stop&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A classe finalmente deve ficar assim:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;framework&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;TestCase&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;openqa&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;selenium&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;server&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;SeleniumServer&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; com&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;thoughtworks&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;selenium&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;DefaultSelenium&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; com&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;thoughtworks&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;selenium&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Selenium&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; login &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;extends&lt;/span&gt; TestCase &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; Selenium selenium&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setUp&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; url &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"http://www.meuslivroseletronicos"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(0, 0, 230);"&gt;".com.br"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:   selenium &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; DefaultSelenium&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"localhost"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;11:     SeleniumServer&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getDefaultPort&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"*firefox"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;12:     url&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;start&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; tearDown&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;17:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;stop&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;19:&lt;br /&gt;20:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testLoginLivro&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Exception&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;21:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;open&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"/login.action;jsessionid=BEF"&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;br /&gt;22:   &lt;span style="color: rgb(0, 0, 230);"&gt;"47FEE6B27A5E7EA20DB20E6F3F4F2"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;23:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;type&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"j_username"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"admin"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;24:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;type&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"j_password"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"1234"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;click&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"submit"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;26:   selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;waitForPageToLoad&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"30000"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;27:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Livro Eletronico"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;28:     selenium&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getTitle&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;29:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;30: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Estarte o selenium server: java -jar selenium-server.jar que está no diretório selenium-remote-control-0.9.2\selenium-server-0.9.2 do Selenium-RC.&lt;br /&gt;&lt;br /&gt;Agora rode como se fosse um teste comum do JUnit.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4x-irBbGvFc/R8chrge-b8I/AAAAAAAAADY/pb9Paes2YnI/s1600-h/telafinal.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://2.bp.blogspot.com/_4x-irBbGvFc/R8chrge-b8I/AAAAAAAAADY/pb9Paes2YnI/s320/telafinal.JPG" alt="" id="BLOGGER_PHOTO_ID_5172139728396251074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Links que podem ajudar:&lt;br /&gt;&lt;br /&gt;Selenium (&lt;a href="http://selenium-ide.openqa.org/"&gt;http://selenium-ide.openqa.org/&lt;/a&gt;)&lt;br /&gt;Download em (&lt;a href="http://selenium-core.openqa.org/download.jsp"&gt;http://selenium-core.openqa.org/download.jsp&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Selenium IDE 4 Firefox (&lt;a href="http://release.openqa.org/selenium-ide/0.8.7/selenium-ide-0.8.7.xpi"&gt;http://release.openqa.org/selenium-ide/0.8.7/selenium-ide-0.8.7.xpi&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Selenium 4 Java (&lt;a href="http://selenium-rc.openqa.org/java.html"&gt;http://selenium-rc.openqa.org/java.html&lt;/a&gt;)&lt;br /&gt;Download em (&lt;a href="http://selenium-rc.openqa.org/download.jsp"&gt;http://selenium-rc.openqa.org/download.jsp&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3777070249667522251?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3777070249667522251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3777070249667522251'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/descobrindo-o-selenium.html' title='Descobrindo o Selenium'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4x-irBbGvFc/R8chEAe-b4I/AAAAAAAAAC4/NZZKDmFEnkY/s72-c/usando+o+plugin+do+firefox.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3556940801929218960</id><published>2008-02-25T13:12:00.000-08:00</published><updated>2008-02-26T03:55:51.340-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teste de Integração'/><title type='text'>Teste de Integração</title><content type='html'>O Teste de Integração, ao contrario do Teste Unitário, não se preocupa com o conceito de módulos. Essa modalidade de testes, como seu nome indica, promove o teste de uma funcionalidade sem se preocupar com "de quem é a responsabilidade?".&lt;br /&gt;&lt;br /&gt;Pense numa situação de um cadastro, com Teste Unitário você deve criar um teste para as regras de negócios, um outro para os métodos de persistência, porém, no Teste de Integração, você testa somente o método Inserir, ou Update ou Delete e deixa que os módulos si relacionem de verdade, sem Mock Objects, sem nenhum artifício qualquer.&lt;br /&gt;&lt;br /&gt;Quando falo "comparando" Testes Unitários com Testes de Integração, não estou dizendo que um é melhor que o outro, até porque eles devem conviver de maneira harmônica, os Testes de Integração verificam um outro escopo, verificam a integração entre os módulos, tanto que, se os testes unitários foram feitos de maneira correta, um teste de integração NUNCA (ao menos, não deverá) encontrará um problema na regra do método implementado, pode encontrar problemas numa injeção de dependências feita pelo Spring ou coisa parecida.&lt;br /&gt;&lt;br /&gt;Breve vou escrever sobre o Selenium, uma ferramenta espetacular para fazer Testes de Integração.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3556940801929218960?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3556940801929218960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3556940801929218960'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/teste-de-integrao.html' title='Teste de Integração'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4957523696195757068</id><published>2008-02-18T13:23:00.000-08:00</published><updated>2008-02-21T13:19:29.374-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='Boas práticas'/><title type='text'>Melhorando o Design da Aplicação e a construção de testes</title><content type='html'>O TDD tem como sua maior incumbência, auxiliar na construção do design dos seus métodos, com o tempo vimos situações particulares e tentamos encontrar soluções para as mais diversas situações, como &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html"&gt;JMockit&lt;/a&gt;, &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas-2-misso.html"&gt;CGLib&lt;/a&gt; e outros.&lt;br /&gt;&lt;br /&gt;Porém tivemos, aqui na empresa, a visita do &lt;a href="http://www.caelum.com.br/caelum/instrutores.jsp"&gt;Paulo Silveira&lt;/a&gt; da &lt;a href="http://blog.caelum.com.br/"&gt;CAELUM&lt;/a&gt; e mudou bastante o meu conceito de como alcançar a melhoria no desenvolvimento de testes e consequentemente, das classes de um sistema.&lt;br /&gt;&lt;br /&gt;Citarei umas idéias que achei bem interessantes:&lt;br /&gt;&lt;br /&gt;1) Use Injeção de Dependência. No Spring temos o IoC que nos proporciona essa técnica, é notório a facilidade que ganhamos na construção de testes, principalmente no TDD.&lt;br /&gt;2) Use e abuse de Interfaces. O uso de Interfaces nos oferece, além do óbvio, uma facilidade muito maior na construção de testes, pois o padrão para construção de Mock Objects é utilizar Interfaces.&lt;br /&gt;3) Evite os método estáticos. Métodos estáticos tem alto acoplamento e são ruins de testar, neste momento eu falei sobre JMockit, mas ele frisou que testes devem ser simples e que artifícios como esses podem complicá-los.&lt;br /&gt;&lt;br /&gt;Por fim, ele falou algo que achei bem interessante, acho que ele tirou do &lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1203369355&amp;amp;sr=8-1"&gt;Design Patters do GoF&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"Evite as extenções e abuse das implementações", não sei bem se foram essas as palavras, mas a idéia foi essa.&lt;br /&gt;&lt;br /&gt;E como me lembrou o Capitão Sávio Pierre, "Em vez de extender, procure fazer Agregações ou Composições". Isso também é sensacional.&lt;br /&gt;&lt;br /&gt;Bem, acho que existem situações em que essas boas práticas podem não ser possíveis, mas confesso que estarei sempre atento a elas.&lt;br /&gt;&lt;br /&gt;Fica aqui a indicação da CAELUM e do próprio Paulo Silveira, o workshop ministrado por ele foi muito bacana.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4957523696195757068?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4957523696195757068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4957523696195757068'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/melhorando-o-design-da-aplicao-e.html' title='Melhorando o Design da Aplicação e a construção de testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1776641844899646348</id><published>2008-02-11T12:52:00.000-08:00</published><updated>2008-12-09T03:21:35.917-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='JMockit'/><title type='text'>Fazendo testes com Ant + JUnit + JMockit</title><content type='html'>Para fazer seus testes com o auxílio do Ant, seguem alguns passos que extraí do que já utilizamos aqui na empresa:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Primeiro Passo:&lt;/span&gt; crie 2 arquivos e coloque na raiz da aplicação:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;build.xml&lt;br /&gt;build.properties&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Segundo Passo:&lt;/span&gt; no build.xml, crie a seguinte estrutura (ela pode ser mais simplificada):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;*tire os '$' de todas as linhas&lt;/span&gt;&lt;br /&gt;&lt;$project name="NomeDoProjeto" basedir=".." default="integrate"&gt;&lt;br /&gt;  &lt;$property file="${ant.project.name}/build.properties"/&gt;&lt;br /&gt;  &lt;$property name="project.dir" value="${ant.project.name}"/&gt;&lt;br /&gt;  &lt;$property name="src.dir" value="${project.dir}/src"/&gt;&lt;br /&gt;  &lt;$property name="build.dir" value="${project.dir}/web/WEB-INF/classes"/&gt;&lt;br /&gt;  &lt;$property name="lib.dir" value="${project.dir}/web/WEB-INF/lib"/&gt;&lt;br /&gt;  &lt;$property name="allTests.class" value="com.NomeDoProjeto.test.AllTests"/&gt;&lt;br /&gt;&lt;br /&gt;  &lt;$path id="project.classpath"&gt;&lt;br /&gt;      &lt;$pathelement location="${build.dir}"/&gt;&lt;br /&gt;      &lt;$fileset dir="${lib.dir}"&gt;&lt;br /&gt;          &lt;$include name="*.jar"/&gt;&lt;br /&gt;      &lt;$/fileset&gt;&lt;br /&gt;      &lt;$fileset dir="${tomcat.lib}"&gt;&lt;br /&gt;          &lt;$include name="*-api.jar"/&gt;&lt;br /&gt;          &lt;$include name="jasper-runtime.jar"/&gt;&lt;br /&gt;      &lt;$/fileset&gt;&lt;br /&gt;  &lt;$/path&gt;&lt;br /&gt;&lt;br /&gt;  &lt;$taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"&gt;&lt;br /&gt;      &lt;$classpath refid="project.classpath"/&gt;&lt;br /&gt;  &lt;$/taskdef&gt;&lt;br /&gt;&lt;br /&gt;  &lt;$target name="build"&gt;&lt;br /&gt;      &lt;$mkdir dir="${build.dir}"/&gt;&lt;br /&gt;      &lt;$javac debug="on" srcdir="${src.dir}" destdir="${build.dir}" failonerror="true"&gt;&lt;br /&gt;          &lt;$classpath refid="project.classpath"/&gt;&lt;br /&gt;      &lt;$/javac&gt;&lt;br /&gt;  &lt;$/target&gt;&lt;br /&gt;&lt;br /&gt;  &lt;$target name="test" depends="build"&gt;&lt;br /&gt;      &lt;$dirname file="build.xml" property="current.dir"/&gt;&lt;br /&gt;      &lt;$junit haltonfailure="true" haltonerror="true" fork="true" dir="${current.dir}"&gt;&lt;br /&gt;          &lt;$jvmarg value="-javaagent:${jmockit.dir}"/&gt;&lt;br /&gt;          &lt;$classpath&gt;&lt;br /&gt;              &lt;$path refid="project.classpath"/&gt;&lt;br /&gt;          &lt;$/classpath&gt;&lt;br /&gt;          &lt;$formatter type="plain" usefile="false"/&gt;&lt;br /&gt;          &lt;$test name="${allTests.class}"/&gt;&lt;br /&gt;      &lt;$/junit&gt;&lt;br /&gt;  &lt;$/target&gt;&lt;br /&gt;&lt;br /&gt;&lt;$/project&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Terceiro Passo:&lt;/span&gt; no build.properties, crie as variáveis( ${variavel} ) que são usadas no xml:&lt;br /&gt;&lt;br /&gt;tomcat.lib=C:\\Arquivos de programas\\Apache Software Foundation\\Tomcat 5.5\\common\\lib&lt;br /&gt;jmockit.dir=C:\\jmockit.jar&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quarto Passo:&lt;/span&gt; Para rodar o Ant (estou usando o Eclipse), clique com o botão direito no build.xml / Run As / Ant Build...&lt;br /&gt;&lt;br /&gt;Na aba Targets, marque a target test e na aba Classpath, adicione o jar do JUnit.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4x-irBbGvFc/R7C11Qe-bzI/AAAAAAAAACE/X9YksvbLdfA/s1600-h/tela_ant.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_4x-irBbGvFc/R7C11Qe-bzI/AAAAAAAAACE/X9YksvbLdfA/s320/tela_ant.JPG" alt="" id="BLOGGER_PHOTO_ID_5165828699156541234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A partir daí é só rodar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para o uso do &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html"&gt;JMockit&lt;/a&gt; adicionamos estas linhas (estão adicionadas nos exemplos acima, as linhas seguintes são somente informativas, porém se você não usar JMockit, remova-as):&lt;br /&gt;&lt;br /&gt;No build.xml:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;*sem o '$'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;$jvmarg value="-javaagent:${jmockit.dir}"/&gt;&lt;br /&gt;&lt;/span&gt;&lt;jvmarg value="-javaagent:${jmockit.dir}"&gt;Adiciona o argumento na JVM.&lt;br /&gt;&lt;br /&gt;No build.properties:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;jmockit.dir=C:\\jmockit.jar&lt;/span&gt;&lt;br /&gt;Indica onde está o jar do JMockit.&lt;/jvmarg&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1776641844899646348?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1776641844899646348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1776641844899646348'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/fazendo-testes-com-ant-junit-jmockit.html' title='Fazendo testes com Ant + JUnit + JMockit'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4x-irBbGvFc/R7C11Qe-bzI/AAAAAAAAACE/X9YksvbLdfA/s72-c/tela_ant.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-5336278100005982752</id><published>2008-02-11T08:33:00.000-08:00</published><updated>2008-12-09T03:21:36.057-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMockit'/><title type='text'>Problema com JMockit</title><content type='html'>O JMockit foi comentado no post &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html"&gt;Mockando um Método Estático&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bem, em algumas maquinas aqui da empresa, estava acontecendo o seguinte erro:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;java.lang.VerifyError: (class: junit/framework/TestCase, method: runTest signature: ()V) Illegal constant pool index&lt;br /&gt;  at java.lang.Class.getDeclaredMethods0(Native Method)&lt;br /&gt;  at java.lang.Class.privateGetDeclaredMethods(Class.java:2365)&lt;br /&gt;  at java.lang.Class.getMethod0(Class.java:2611)&lt;br /&gt;  at java.lang.Class.getMethod(Class.java:1579)at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.&lt;br /&gt;getTest(JUnit3TestLoader.java:99)at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.&lt;br /&gt;loadTests(JUnit3TestLoader.java:59)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.&lt;br /&gt;runTests(RemoteTestRunner.java:445)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.&lt;br /&gt;runTests(RemoteTestRunner.java:673)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.&lt;br /&gt;run(RemoteTestRunner.java:386)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.&lt;br /&gt;main(RemoteTestRunner.java:196)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O interessante esta no trecho "&lt;span style="font-style: italic;"&gt;em algumas maquinas&lt;/span&gt;", se o jar do JMockit e o método onde foi usado são os mesmos, por que somente em algumas maquinas aconteceu esse erro, e não em todas?&lt;br /&gt;&lt;br /&gt;A verdade é que o erro não tem nada haver com JMockit, mas como faz parte do processo de fazer o JMockit funcionar, vou postar a minha solução aqui:&lt;br /&gt;&lt;br /&gt;Li em vários lugares que o problema era causado pela JVM, que não suportava o parâmetro (figura abaixo). Onde li, dizia que o motivo era a quantidade de parâmetros passados pra JVM, e que era um problema da VM do Java 5. &lt;span style="font-weight: bold;"&gt;Não me aprofundei no assunto e nem pretendo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R7B5Xwe-bxI/AAAAAAAAAB0/yEIsPoSPn8E/s1600-h/argumento.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R7B5Xwe-bxI/AAAAAAAAAB0/yEIsPoSPn8E/s320/argumento.JPG" alt="" id="BLOGGER_PHOTO_ID_5165762221652733714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-style: italic;"&gt;Runtime JRE&lt;/span&gt;, estava apontando para o diretório de uma JRE instalada, então apontei para o diretório da JDK e pronto, funcionou:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R7B5lwe-byI/AAAAAAAAAB8/wPd5bUJVEkw/s1600-h/run.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R7B5lwe-byI/AAAAAAAAAB8/wPd5bUJVEkw/s320/run.JPG" alt="" id="BLOGGER_PHOTO_ID_5165762462170902306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Caso este procedimento não seja suficiente para fazer com que seus testes funcionem, o problema pode ser da versão da sua JVM (a testada foi 1.5.0_08), instale outra e refaça o procedimento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-5336278100005982752?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5336278100005982752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5336278100005982752'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/problema-com-jmockit.html' title='Problema com JMockit'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4x-irBbGvFc/R7B5Xwe-bxI/AAAAAAAAAB0/yEIsPoSPn8E/s72-c/argumento.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2140915209252575715</id><published>2008-02-07T08:23:00.000-08:00</published><updated>2008-02-14T08:32:07.665-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='100% de Cobertura'/><title type='text'>Confusões sobre Cobertura de Código</title><content type='html'>Existem muitas idéias confusas sobre o conceito "100% de Cobertura", além das que já existentes no sentido de seguir ou não esta prática.&lt;br /&gt;&lt;br /&gt;Começo esclarecendo que a Cobertura de Código é baseada em código coberto por Testes Unitários, pois um teste de Integração, por exemplo, testa telas, integração entre módulos, mas não analisa linhas cobertas.&lt;br /&gt;&lt;br /&gt;Outra confusão é sobre a profundidade de um teste, quando tratamos deste assunto. Para que um método esteja 100% Coberto, o teste precisa somente passar por todas as suas linhas do código do método testado. Desta forma, o teste pode não ser completo, pois não testará "todas" as possibilidades, e mesmo assim será considerado 100% coberto. Com isso, não quero dizer que não devemos procurar a completude do teste.&lt;br /&gt;&lt;br /&gt;A cobertura de código não garante, por si só, a qualidade no desenvolvimento, ter seu código 100% coberto é somente uma das várias práticas que lhe ajudam a obter sucesso no desenvolvimento.&lt;br /&gt;&lt;br /&gt;Para garantir 100% de Cobertura, algumas vezes você será obrigado a fazer testes "inúteis", tomando o exemplo de meros getters e setters, esse é um dos motivos que faz com que algumas pessoas não "gostem" da idéia.&lt;br /&gt;&lt;br /&gt;Manter seu código 100% Coberto é uma tarefa muito questionada, em várias situações quando nos preocupamos apenas com a arquitetura da nossa aplicação, preferimos não manter o código 100% Coberto. Porém, essa decisão tem &lt;a href="http://www.blogger.com/%28http://thinkabouttests.blogspot.com/2007/12/100-de-cobertura-at-quanto-isso.html%29"&gt;efeitos comerciais&lt;/a&gt;, e estes também devem ser considerados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2140915209252575715?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2140915209252575715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2140915209252575715'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/02/confuses-sobre-cobertura-de-cdigo.html' title='Confusões sobre Cobertura de Código'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4216627755814378866</id><published>2008-01-24T12:37:00.000-08:00</published><updated>2008-03-12T09:40:50.999-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='escopo'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>Teste Unitário - Como definir o seu escopo?</title><content type='html'>Quando se está começando a fazer testes, o assunto mais incompreendido é "até onde o teste unitário deve testar". Muitos confundem a idéia de unidade, e até começar a usar Mock Objects é um passo gigantesco e confuso.&lt;br /&gt;&lt;br /&gt;Definições encontradas na WEB:&lt;br /&gt;&lt;br /&gt;"O teste unitário ou de unidade é uma modalidade de testes que se concentra na verificação da menor unidade do projeto de software."&lt;br /&gt;"Este estágio tem foco na verificação dos menores elementos testáveis do software."&lt;br /&gt;"O teste unitário se limita a testar uma única unidade isolada."&lt;br /&gt;&lt;br /&gt;Todas estão certas, e a minha definição para essa categoria de testes é: "Um teste que não ultrapassa a responsabilidade do método testado".&lt;br /&gt;&lt;br /&gt;O que quer dizer que, não podemos ultrapassar a responsabilidade do método, da classe ou da camada. O negócio exige bom senso, pois um exemplo de quando ultrapassar a barreira do método é no caso de &lt;a href="http://thinkabouttests.blogspot.com/2007/12/como-testar-um-mtodo-privado.html"&gt;testar Métodos Privados&lt;/a&gt;, porém os escopos se confundem nesses casos.&lt;br /&gt;&lt;br /&gt;Situações mais claras são quando tratamos classes diferentes, por exemplo:&lt;br /&gt;&lt;br /&gt;Temos uma classe (ClassePeba) e testamos um método (getAlgo) desta classe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClassePeba &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:   ClasseCriptografa classeCriptografa &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;br /&gt;4:    &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:   palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;6:     palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; palavra&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;9: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;o método (getAlgo) invoca um outro método (criptogravaPalavra) de outra classe (ClasseCriptografa):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseCriptografa &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;i &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"a"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"b"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"l"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"?"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;else&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"a"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"b"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"$"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"l"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"%"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;12:&lt;br /&gt;13:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; palavra&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;No teste do método (getAlgo):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Before&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Test&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Assert&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestClassePeba &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6:  ClassePeba classePeba&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:&lt;br /&gt;8:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;9:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; prepare&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:  classePeba &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClassePeba&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;15:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testGetAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;17:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"!?@!?@!?@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"$%*$%*$%*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Estamos testando duas classes distintas, caso aconteça uma inconformidade na outra classe (ClasseCriptografa), o erro irá acontecer no teste do método getAlgo, que não tem erro algum.&lt;br /&gt;&lt;br /&gt;Dessa forma, o que deve ser feito é:&lt;br /&gt;&lt;br /&gt;Primeiro, faço uma Refatoração para não instanciar a classe dentro do método, o &lt;a href="http://thinkabouttests.blogspot.com/2008/01/testes-dirigem-o-design.html"&gt;teste definiu o design&lt;/a&gt; do método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; String getAlgo(int i,&lt;br /&gt;1:  ClasseCriptografa classeCriptografa)&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;5:    palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; palavra&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Crie um teste para o método getAlgo, mockando a classe ClasseCriptografa:&lt;br /&gt;&lt;br /&gt;* para mockar uma classe com JMock, é necessário** criar a interface:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;interface&lt;/span&gt; ClasseCriptografiaInterface &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;abstract&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;2:    &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&lt;/span&gt;&lt;/pre&gt;** tambem é possível mockar uma classe concreta, veja &lt;a href="http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas-2-misso.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;jmock&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Mock&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;jmock&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;MockObjectTestCase&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Before&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Test&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestClassePeba &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;extends&lt;/span&gt; MockObjectTestCase&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:&lt;br /&gt;7:  ClassePeba classePeba&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  Mock classeCriptografa &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setUp&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;12:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:   classePeba &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClassePeba&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:   classeCriptografa &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Mock&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;15:     ClasseCriptografiaInterface&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;19:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testGetAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;20:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;21:  classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;expects&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;once&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;22:   method&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"criptogravaPalavra"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;23:    with&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;will&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;returnValue&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;24:      &lt;span style="color: rgb(0, 0, 230);"&gt;"!?@!?@!?@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"!?@!?@!?@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;26:    ClasseCriptografiaInterface&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;27:     proxy&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;28:&lt;br /&gt;29:  classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;expects&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;once&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;method&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;30:    &lt;span style="color: rgb(0, 0, 230);"&gt;"criptogravaPalavra"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;with&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;31:      eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;will&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;returnValue&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"$%*$%*$%*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;32:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"$%*$%*$%*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;33:    &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;ClasseCriptografiaInterface&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;34:    proxy&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;35:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;36: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Até aqui o método criptogravaPalavra não foi sequer executado.&lt;br /&gt;&lt;br /&gt;Depois criamos um teste específico para a classe ClasseCriptografa:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Assert&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;assertEquals&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Before&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;junit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;Test&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestClasseCriptografa&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:&lt;br /&gt;7:  ClasseCriptografa classeCriptografa&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setUp&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:   classeCriptografa &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClasseCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14:&lt;br /&gt;15:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testGetAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;17:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;18:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"!?@!?@!?@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;19:     criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;20:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"$%*$%*$%*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classeCriptografa&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;21:     criptogravaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;22:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;23: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Pronto!&lt;br /&gt;&lt;br /&gt;A idéia é ter seus testes bem separados, pois em momentos de refatoração, encontrar os erros do método e a alteração do próprio teste será facilitada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4216627755814378866?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4216627755814378866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4216627755814378866'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/teste-unitrio-como-definir-o-seu-escopo.html' title='Teste Unitário - Como definir o seu escopo?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-6833666353253835096</id><published>2008-01-22T12:37:00.000-08:00</published><updated>2008-03-17T08:43:13.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testng'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>TestNG - Uma ótima alternativa</title><content type='html'>O TestNG é uma ferramenta largamente utilizada para fazer Testes de Unidade (pelo que andei ouvindo, até mais que isso), aqui na empresa, o &lt;a href="http://israelfreitas.blogspot.com/"&gt;Israel Freitas&lt;/a&gt; usa essa ferramenta e tenta a muito tempo evangelizar outros, porém pouco lhe dei ouvidos, "já que eu tenho o JUnit pra que procurar outra ferramenta que faz a mesma coisa de maneira diferente" ? Mas por insistência dele, resolvi fazer um teste e publicar algo sobre o assunto, confesso que minha opinião sobre o TestNG mudou de maneira drástica.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Esta ferramenta foi criada por Cédric Beust (a senior software engineer at Google) e Alexandru Popescu, esta já usa conceitos como Annotations bem antes do JUnit, além disso, percebi muitas funcionalidades e facilidades oferecidas por ele.&lt;br /&gt;&lt;br /&gt;Um conceito interessante é o de &lt;a href="http://testng.org/doc/documentation-main.html#dependent-methods"&gt;dependência&lt;/a&gt; entre testes, vale a pena ser estudado.&lt;br /&gt;&lt;br /&gt;O TestNG (a versão testada é a 5.6) permite a utilização dos asserts do JUnit, inserindo somente o import: import static org.testng.AssertJUnit.*;&lt;br /&gt;&lt;br /&gt;Para ilustrar, criei um exemplo bem simples:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Foi criado a classe POJO somente com 2 atributos e seus getters e setters:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; POJO &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; id&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; nome&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; getId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; id&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; id&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;9:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;id &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; id&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; getNome&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; nome&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setNome&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; nome&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;15:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;nome &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; nome&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;17: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Um teste bem simples foi feito pra a classe:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;testng&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;annotations&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt; static org&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;testng&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 74, 67);"&gt;AssertJUnit&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;*&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;2:&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; POJOTest&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;BeforeClass&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; setUp&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; gettersAndSettersTest&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:   POJO pojo &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; getEntidade&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;pojo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; POJO getEntidade&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;17:   POJO pojo &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; POJO&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:   pojo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:   pojo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setNome&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"nome"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;20:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; pojo&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;22: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;* Perceba que uso os asserts do JUnit.&lt;br /&gt;&lt;br /&gt;Criei o arquivo de configuração do TestNG:&lt;br /&gt;*tire os '$' de todas as linhas&lt;br /&gt;&lt;br /&gt; &lt;$!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" &gt;&lt;br /&gt; &lt;$suite name="My First TestNG test"&gt;&lt;br /&gt;   &lt;$test name="Hello Test!"&gt;&lt;br /&gt;     &lt;$classes&gt;&lt;br /&gt;       &lt;$class name="POJOTest" /&gt;&lt;br /&gt;     &lt;$/classes&gt;&lt;br /&gt;   &lt;$/test&gt;&lt;br /&gt; &lt;$/suite&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Utilizando o plugin para o Eclipse rodei este teste com extrema facilidade e o log do resultado foi gerado:&lt;br /&gt;&lt;br /&gt; [Parser] Running:&lt;br /&gt;   C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\TestNGExamples\temp-testng-customsuite.xml&lt;br /&gt;&lt;br /&gt; PASSED: gettersAndSettersTest&lt;br /&gt;&lt;br /&gt; ===============================================&lt;br /&gt;     POJOTest&lt;br /&gt;     Tests run: 1, Failures: 0, Skips: 0&lt;br /&gt; ===============================================&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; ===============================================&lt;br /&gt; TestNGExamples&lt;br /&gt; Total tests run: 1, Failures: 0, Skips: 0&lt;br /&gt; ===============================================&lt;br /&gt;&lt;br /&gt;O nível de detalhes do log do resultado é determinado na propriedade "Log Level" da configuração da execução do TestNG.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Os links abaixo vão ajudar muito na utilização do TestNG.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://testng.org/"&gt;Site oficial&lt;br /&gt;&lt;/a&gt;&lt;a href="http://testng.org/doc/eclipse.html"&gt;Plugin pro Eclipse&lt;/a&gt;&lt;br /&gt;&lt;a href="http://testng.org/doc/documentation-main.html#annotations"&gt;Annotations pra todos os gostos&lt;/a&gt;&lt;br /&gt;&lt;a href="http://testng.org/doc/ant.html"&gt;TestNG com Ant&lt;/a&gt;&lt;br /&gt;&lt;a href="http://testng.org/doc/migrating.html"&gt;Automatizando a Migração do JUnit para o TestNG&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-cq08296/?ca=dgr-jw17JUnit4vsTestNG"&gt;Comparação entre TestNG e JUnit4&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-04-2005/jw-0404-testng.html"&gt;Bom artigo sobre o assunto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Avaliação geral:&lt;br /&gt;&lt;br /&gt;Como um usuário do JUnit, considero o TestNG um adversário de peso, bem mais rico quando se fala de annotations. Acredito que esta ferramenta deve ter seu uso considerado, além de ser muito robusta e cheia de novidades, tem muita documentação disponível na WEB.&lt;br /&gt;A única carência que percebi, foi a ausência de asserts, porém com introdução dos asserts do JUnit a carência foi resolvida.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-6833666353253835096?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6833666353253835096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6833666353253835096'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/testng-uma-tima-alternativa.html' title='TestNG - Uma ótima alternativa'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-4734034329084276101</id><published>2008-01-18T18:10:00.000-08:00</published><updated>2008-02-14T08:34:55.714-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Teste de Regressão'/><title type='text'>Teste de Regressão</title><content type='html'>Sempre escuto falar nesse tal, e achando que não teria tempo para estudar mais uma "novidade" no mundo dos testes, fui adiando, adiando até a curiosidade me forçar a procurar algo sobre o assunto. Daí vi essa definição:&lt;br /&gt;&lt;br /&gt;"O Teste de Regressão consiste na aplicação de testes à versão mais recente do software, para garantir que não surgiram novos defeitos em componentes já testados. Se ao juntar o novo componente ou as suas alterações com os restantes componentes do sistema, surgirem novos defeitos em componentes inalterados, então considera-se que o sistema regrediu."&lt;br /&gt;&lt;br /&gt;Vi este outro conceito também:&lt;br /&gt;&lt;br /&gt;"Os testes automáticos têm uma vantagem em relação aos manuais: são facilmente repetíveis. Portanto, são favorecidos no momento dos testes de regressão."&lt;br /&gt;&lt;br /&gt;Dessa forma, percebi que faço testes de regressão várias vezes ao dia, sempre que pratico &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Integração Contínua&lt;/a&gt;, percebi também a força deste conceito e que é muito fácil ter Testes de Regressão, basta manter os testes criados no &lt;a href="http://thinkabouttests.blogspot.com/2007/12/tdd-desenvolvimento-orientado-testes.html"&gt;TDD&lt;/a&gt; e a Integração Contínua  acontecendo de maneira sistemática.&lt;br /&gt;&lt;br /&gt;Uma dica para quem está começando é: Não faça esses testes de forma manual, automatize.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-4734034329084276101?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4734034329084276101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/4734034329084276101'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/teste-de-regresso.html' title='Teste de Regressão'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1926418123789205611</id><published>2008-01-16T08:37:00.000-08:00</published><updated>2008-02-14T08:48:43.212-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMock'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>Passagem de vários parâmetros para método mockado</title><content type='html'>De acordo com o post &lt;a href="http://thinkabouttests.blogspot.com/2007/12/passagem-de-parametros-para-mtodo.html"&gt;Passagem de parâmetros para método mockado&lt;/a&gt;, a quantidade de parâmetros passados para o método mockado deve ser igual a do método "de verdade", desta forma encontrei um problema esta manhã:&lt;br /&gt;&lt;br /&gt;Tinha um teste para um método, e nele, mockava um método de um outro objeto da seguinte forma:&lt;br /&gt;&lt;br /&gt;historicoClienteDao.expects(once()).method("findByFiltros").with(1L, "nome", null, 3L).will(returnValue(historicos));&lt;br /&gt;&lt;br /&gt;porém, este método ganhou mais um parâmetro e quando o adicionei, deu erro de compilação:&lt;br /&gt;&lt;br /&gt;historicoClienteDao.expects(once()).method("findByFiltros").with(1L, "nome", null, 3L, &lt;span style="font-weight: bold;"&gt;true&lt;/span&gt;).will(returnValue(historicos));&lt;br /&gt;&lt;br /&gt;pois o método with só recebe 4 Constraints.&lt;br /&gt;&lt;br /&gt;Aí foi que percebi que ele também recebe um array de Constraints e então o "problema" foi resolvido da seguinte forma:&lt;br /&gt;&lt;br /&gt;historicoClienteDao.expects(once()).method("findByFiltros").with(&lt;span style="font-weight: bold;"&gt;new Constraint[]{1L, "nome", null, 3L, true}&lt;/span&gt;).will(returnValue(historicos));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ps. a ferramenta usada neste exemplo é o JMock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1926418123789205611?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1926418123789205611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1926418123789205611'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/passagem-vrios-parmetros-para-mtodo.html' title='Passagem de vários parâmetros para método mockado'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-471908705120004915</id><published>2008-01-13T17:03:00.000-08:00</published><updated>2008-01-13T17:06:57.271-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>TDD - Os testes devem ser feitos antes ou durante a implementação?</title><content type='html'>A resposta é clara, DURANTE. Porém, existem vertentes que tratam o "DURANTE" de maneira mais ou menos radical, bem vou tentar explicar o conceito:&lt;br /&gt;&lt;br /&gt;A vertente 1 acredita que o código de testes deve ser feito "ao mesmo" tempo que a implementação da funcionalidade. Bem, sejamos mais claros, os praticantes dessa vertente acreditam que deve ir descobrindo o que o método vai fazer a medida que o vai escrevendo.&lt;br /&gt;&lt;br /&gt;Nessa abordagem, o FeedBack é mais rápido.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dojofloripa.wordpress.com/2006/11/28/confusoes-sobre-tdd/"&gt;leitura recomendada&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A vertente 2 considera a possibilidade de começar "ANTES" e continuar "DURANTE".&lt;br /&gt;&lt;br /&gt;Num &lt;a href="http://dojofloripa.wordpress.com/2006/11/28/confusoes-sobre-tdd/#comment-37"&gt;comentário&lt;/a&gt; do &lt;a href="http://thiagoarrais.wordpress.com/2006/11/29/btuf/"&gt;Thiago Arrais&lt;/a&gt; sobre a leitura recomendada acima, a idéia de fazer o teste "DURANTE" a implementação tem um conceito menos literal, veja a frase: "Escreva os testes que conseguir imaginar antes de começar a escrever o código...".&lt;br /&gt;&lt;br /&gt;Como o próprio &lt;a href="http://thiagoarrais.wordpress.com/2006/11/29/btuf/"&gt;Thiago&lt;/a&gt; se preocupa em "não demorar demais pensando", esta técnica deve ter este cuidado tomado, então concluímos essa abordagem como:&lt;br /&gt;&lt;br /&gt;Faça os testes que você idealizou imediatamente, como num validador de PDF, essa técnica diz, por exemplo, que você já pode fazer os testes pra dois CPFs diferentes(um certo e um errado), antes mesmo de implementar a primeira linha do código do validador, você também pode testar um CPF com menos dígitos, com mais dígitos, etc.&lt;br /&gt;&lt;br /&gt;Nessa abordagem, a maior vantagem é "pensar mais" antes de começar a implementação.&lt;br /&gt;&lt;br /&gt;Eu sou um seguidor da segunda vertente, isso porque considero mais fácil de fazer e obtive melhores resultados fazendo dessa forma, porém não sou nada radical quanto a isso, acredito que existam várias situações em que a primeira vertente seja mais indicada. Também não acho que exista a "forma certa" de fazer, o certo é que vale a pena ser feito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-471908705120004915?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/471908705120004915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/471908705120004915'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/tdd-os-testes-devem-ser-feitos-antes-ou.html' title='TDD - Os testes devem ser feitos antes ou durante a implementação?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-5563057643992582762</id><published>2008-01-13T17:00:00.000-08:00</published><updated>2008-02-14T08:35:58.964-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>TDD - Testes são somente a consequência</title><content type='html'>Pois é, você pode até  ter ouvido isso em outro lugar, mas existe uma grande chance de você ter "descoberto" antes mesmo de ouvir.&lt;br /&gt;&lt;br /&gt;Sei que é óbvio, mas como vejo muita gente confundindo o "processo" de TDD com Testes Unitários, resolvi dar minha contribuição.&lt;br /&gt;&lt;br /&gt;O TDD tem como objetivo dirigir o design da implementação, essa é, sem dúvida, o maior lucro de usar TDD. O segundo maior lucro é ter sua aplicação coberta por testes.&lt;br /&gt;&lt;br /&gt;Tendo suas implementações dirigidas por testes, estes se tornam parte da sua aplicação, pra ser mais claro, o código desenvolvido na classe de teste passa a funcionar "até mesmo" como documentação, além do óbvio, que é o fato da sua implementação ter sido baseada no teste. Um método pode, em &lt;a href="http://thinkabouttests.blogspot.com/2008/01/testes-dirigem-o-design.html"&gt;muitas situações&lt;/a&gt;, ter sua implementação modificada pra facilitar o teste.&lt;br /&gt;&lt;br /&gt;Por que a confusão(TDD X Testes Unitários) acontece?&lt;br /&gt;&lt;br /&gt;Simples, porque fazer TDD é fazer Teste Unitário. Porém, você pode fazer o teste unitário após a funcionalidade estar concluída e isso não é TDD, você terá seu código 100% coberto, mas como já falei, o beneficio maior é dirigir a implementação, ter seu código 100% coberto é apenas a consequência de fazer TDD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-5563057643992582762?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5563057643992582762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/5563057643992582762'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/tdd-testes-so-somente-consequncia.html' title='TDD - Testes são somente a consequência'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3138765278070237837</id><published>2008-01-10T13:15:00.000-08:00</published><updated>2008-03-17T08:49:26.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebWork Action'/><title type='text'>Testando Actions do WebWork 2</title><content type='html'>No site da &lt;a href="http://www.opensymphony.com/"&gt;opensymphony&lt;/a&gt; tem um &lt;a href="http://wiki.opensymphony.com/display/WW/Testing+Actions"&gt;artigo&lt;/a&gt; mostrando como Testar &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Actions do WW&lt;/a&gt;, como não entendi direito, pedi um auxílio ao &lt;a href="http://www.igocoelho.com.br/"&gt;Igo Coelho&lt;/a&gt; e vi que o negócio é mais simples do que parece.&lt;br /&gt;&lt;br /&gt;Para testar &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Actions&lt;/a&gt;, não precisamos estender nada, porém temos que ficar atentos com as variáveis da classe, pois essas terão que ser informadas.&lt;br /&gt;&lt;br /&gt;1) Pra começar, crie uma instancia da &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Action&lt;/a&gt; a ser testada:&lt;br /&gt;&lt;br /&gt;private ArtigoEditAction action;&lt;br /&gt;&lt;br /&gt;é essa variável que será utilizada para invocar os métodos, como também, setar as variáveis da &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Action&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;2) setUp e tearDown pra deixar as coisas nos seus lugares:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;protected&lt;/span&gt; void setUp() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;super&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setUp&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  action &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ArtigoEditAction&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;protected&lt;/span&gt; void tearDown() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;8:  action &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;super&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;tearDown&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;3) A grande maioria desses testes consiste apenas em verificar o direcionamento:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void testExecute() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;execute&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"success"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;4) Como as &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Actions&lt;/a&gt; não retornam os objetos que usaremos nas páginas, eles são populados e passados por request (eu acho), é importante verificar o estado da variável:&lt;br /&gt;&lt;br /&gt;para o método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; String listNormas() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  artigo &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; artigoManager&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;findById&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;artigo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; Action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;SUCCESS&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;a variável artigo é alterada, então não devemos testar somente o retorno, devemos testar também o estado dessa variável após o método ser executado:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void testList() &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;throws&lt;/span&gt; Exception&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  Artigo artigo &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Artigo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  artigo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;L&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:&lt;br /&gt;5:  Artigo artigoCheio &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Artigo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  artigoCheio&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;L&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  artigoCheio&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setResumo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"resumo"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setArtigo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;artigo&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;10:&lt;br /&gt;11:  artigoManager&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;expects&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;once&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;method&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"findById"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;12:  with&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;artigo&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;will&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;returnValue&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;artigoCheio&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getArtigo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getResumo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;listNormas&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"success"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getArtigo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getResumo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"resumo"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;5) Para efeito de 100% de cobertura, eventualmente você terá que forçar umas chamadas de get ou set de alguma propriedade, pois é bem possível que esta não seja invocada naturalmente:&lt;br /&gt;* Um plugin como o &lt;a href="http://thinkabouttests.blogspot.com/2007/12/emma-auxiliando-na-cobertura-de-testes.html"&gt;eclEmma&lt;/a&gt; pode te ajudar muito nessas horas.&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void testCobrirGetsSets()&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Collection&lt;/span&gt; vendedores &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ArrayList&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setVendedores&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;vendedores&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getDataFinalVendas&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getProdutoPacotes&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getProdutoPacote&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getDataInicioVendas&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  action&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;getVendedor&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;usuario&gt;&lt;usuario&gt;* sei que é horrível, mas &lt;a href="http://isanchez.net/2008/01/06/looking-for-some-testing-mantra/"&gt;é melhor um teste feio do que não ter o teste&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Só isso, fácil fazer teste &lt;span style="text-decoration: underline;"&gt;para as &lt;/span&gt;&lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Actions&lt;/a&gt;, né!? :P Se encontrar alguma dificuldade postarei aqui, mas acabou a desculpa de não fazer testes nas &lt;a href="http://wiki.opensymphony.com/display/WW/Understanding+actions"&gt;Actions&lt;/a&gt;.&lt;/usuario&gt;&lt;/usuario&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3138765278070237837?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3138765278070237837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3138765278070237837'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/testando-actions-do-webwork-2.html' title='Testando Actions do WebWork 2'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3188447108006313852</id><published>2008-01-09T17:09:00.000-08:00</published><updated>2008-02-14T08:38:42.634-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boas práticas'/><title type='text'>Boas práticas - Parte I</title><content type='html'>Hoje, desenvolvendo algumas funcionalidades que faziam consultas ao BD, percebi que existem algumas técnicas que podem facilitar a implementação e fortalecer os testes, por isso decidi criar a sessão &lt;span style="font-style: italic;"&gt;Boas práticas&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Neste post vou falar sobre boas práticas em testes para consultas.&lt;br /&gt;&lt;br /&gt;Se você estiver usando SQL "puro" talvez não tenha tanto problema (mesmo achando que essas boas práticas devem ser seguidas) mas usando APIs de persistência, como Hibernate, essas práticas se fazem quase obrigatórias:&lt;br /&gt;&lt;br /&gt;O caso de uso é trazer todas as operações ocorridas entre duas data (os dias 10 e 20 de dezembro, por exemplo).&lt;br /&gt;&lt;br /&gt;* crie testes com valores nos limites.&lt;br /&gt;  crie registros ocorridos exatamente em cada uma das datas (10 e 20 de dezembro).&lt;br /&gt;&lt;br /&gt;* crie testes com valores intermediários.&lt;br /&gt;  crie um registro, pelo menos, ocorrido numa data intermediária (dia 15, por exemplo).&lt;br /&gt;&lt;br /&gt;* crie testes com valores imediatamente fora dos intervalos.&lt;br /&gt;  crie registros ocorridos nas datas vizinhas as limites(9 e 21 de dezembro).&lt;br /&gt;&lt;br /&gt;* se houverem mais campos condicionais, como por exemplo "Tipo de Operação", crie registros que "contrariem" somente essa condição.&lt;br /&gt;  isso é muito útil em sistemas multi-empresa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lógico que existem várias outras boas práticas (por isso postei no título: Parte I), e sempre que lembrar vou tentar postá-las aqui.&lt;br /&gt;&lt;br /&gt;ps. Se você tem mais boas práticas e quiser vê-las neste blog, óbvio que eu preciso concordar com elas, me envie por email (esta lá em "Quem sou?").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3188447108006313852?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3188447108006313852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3188447108006313852'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/boas-prticas-parte-i.html' title='Boas práticas - Parte I'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-7110091165456420522</id><published>2008-01-08T03:52:00.000-08:00</published><updated>2008-03-17T08:59:25.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Testes dirigem o design</title><content type='html'>Pois é, esses dias tive uma discussão na &lt;a href="http://xprio.blogspot.com/"&gt;xprio&lt;/a&gt; sobre um teste que estava bem complicado, isso contraria várias idéias de que os testes não devem ser tão complicados de implementar, o que é verdade, eles não devem ser complicados, bem, o caso era o seguinte:&lt;br /&gt;&lt;br /&gt;Estava testando um método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void enviaEmail()&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(105, 105, 105);"&gt;// faz um monte de coisa&lt;/span&gt;&lt;br /&gt;3:  Mail mail &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Mail&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  mail&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;send&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"Titulo"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"Corpo"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"email@email.com.br"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6:  &lt;span style="color: rgb(105, 105, 105);"&gt;// faz outro monte de coisa&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Dentro deste método, crio a instância de outra classe(Mail) e invoco o método(send) desta. Aí esta o problema, este método(send) envia emails, e isso é algo que não preciso que meu teste faça.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.dtsato.com/blog/default/"&gt;Danilo Sato&lt;/a&gt; levantou esta bola(o teste dirige o design), e me fez algumas perguntas:&lt;br /&gt;&lt;br /&gt;* Que tal passar o e-mail pronto como parâmetro?&lt;br /&gt;* Vale a pena ter o e-mail como atributo dessa classe?&lt;br /&gt;* Qual a responsabilidade dessa classe que está testando? enviar o&lt;br /&gt;e-mail ou criar o email?&lt;br /&gt;&lt;br /&gt;Essas perguntas podem ser generalizadas e usadas em situações onde o teste se torne mais complicado.&lt;br /&gt;&lt;br /&gt;Como se trata de uma situação onde o código já existe e funciona, fazer uma refatoração é o mais indicado a fazer, nada de grandes manobras, apenas desacoplar algumas funcionalidades ou a criação do objeto, como me indicou o &lt;a href="http://tinogomes.wordpress.com/"&gt;Celestino&lt;/a&gt;, com um getInstance por exemplo.&lt;br /&gt;&lt;br /&gt;De qualquer forma, fica a lição de que o teste feito quando usamos TDD é normalmente, pra não dizer: sempre, mais simples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-7110091165456420522?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/7110091165456420522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/7110091165456420522'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/testes-dirigem-o-design.html' title='Testes dirigem o design'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8010389423177194722</id><published>2008-01-07T12:54:00.001-08:00</published><updated>2008-03-17T09:01:18.848-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>Devo testar os métodos que não alteram parâmetros nem retornam nada?</title><content type='html'>Isso é uma questão meio filosófica, pois, qual a necessidade de testar um método que não "faz nada" ?&lt;br /&gt;&lt;br /&gt;Bem, se você ainda não imaginou a situação, lá vai um método da classe Manager:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void reordenar(Object obj, boolean up)&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  getDao&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;reordenar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;obj&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;up&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Com certeza o método reordenar da classe Dao faz muita coisa, e o teste dele será bem útil (sem nenhuma dúvida), mas o que faço com o método reordenar da classe Manager?&lt;br /&gt;&lt;br /&gt;Começando pela premissa de que &lt;a href="http://isanchez.net/2008/01/06/looking-for-some-testing-mantra/"&gt;tudo pode e deve ser testado&lt;/a&gt;, então, devemos implementar um teste para este método.&lt;br /&gt;&lt;br /&gt;Neste caso em particular, o método é muito simples, mas ele poderia não ser e ter a mesma característica, então, consideremos as várias possibilidades de quebra:&lt;br /&gt;&lt;br /&gt;Primeiro imagine, que em qualquer parte do código pode haver um objeto nulo, como neste caso o getDao() poderia tranquilamente retornar null e disparar um NullPointerException na sequência.&lt;br /&gt;&lt;br /&gt;Desta forma, é preferível fazer o teste sem nenhum "assert", porém, cobrindo cada linha do método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void testReordenar()&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Object&lt;/span&gt; obj &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Object&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  classeDao&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;expects&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;once&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;method&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;4:    &lt;span style="color: rgb(0, 0, 230);"&gt;"reordenar"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;with&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;obj&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;5:      eq&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  classeManager&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;reordenar&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;obj&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Se você encontrar outra forma de fazer o teste e achar melhor, faça, mas não deixe de fazê-lo em hipótese alguma.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8010389423177194722?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8010389423177194722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8010389423177194722'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2008/01/devo-testar-os-metodos-que-no-alteram.html' title='Devo testar os métodos que não alteram parâmetros nem retornam nada?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-847992933620703292</id><published>2007-12-20T03:43:00.000-08:00</published><updated>2008-02-14T08:39:49.573-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>Seja "descuidado" com seus testes</title><content type='html'>Primeiramente, perceba que o "descuidado" está entre aspas(" "), com isso quero dizer que ele tem uma razão de existir, e que, óbvio, você não deve negligenciar seus testes.&lt;br /&gt;&lt;br /&gt;Me refiro a ser descuidado com "verificações" que fazemos para evitar exceções, como:&lt;br /&gt;&lt;br /&gt;- verificar se um objeto é null, para não dar NullPointerException;&lt;br /&gt;- no caso de um Array, verificar se existem elementos antes de tentar pegar a posição 0 ou 1 ou qualquer outra;&lt;br /&gt;- verificar divisões por zero;&lt;br /&gt;- problemas com cast;&lt;br /&gt;- e outros.&lt;br /&gt;&lt;br /&gt;Bem, listei acima os que me vieram a cabeça no momento, mas, com certeza, existem muitos outros.&lt;br /&gt;&lt;br /&gt;A dica que quero deixar é que abuse dos testes sem fazer "qualquer" dessas verificações, um teste feito com esse "descuido" pode capturar erros que precisariam de várias verificações para serem encontrados. Esses cuidados devem ser tomados no código do seu método (funcionalidade).&lt;br /&gt;&lt;br /&gt;Claro que você pode criar métodos que esperam uma exceção, e isso deve ser verificado com maior zelo, mas se este não é o objetivo, e exceções são eventuais, seja "descuidado".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-847992933620703292?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/847992933620703292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/847992933620703292'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/seja-descuidado-com-seus-testes.html' title='Seja &quot;descuidado&quot; com seus testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2183926775818229904</id><published>2007-12-19T12:44:00.000-08:00</published><updated>2008-03-17T09:09:22.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='private method'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><title type='text'>Como testar um Método Privado?</title><content type='html'>Pra começar, surgem duas perguntas:&lt;br /&gt;&lt;br /&gt;Devo Fazer? Como devo fazer?&lt;br /&gt;&lt;br /&gt;A primeira resposta é: Claro que sim, se ele pode quebrar, ele deve por motivo óbvios, e se não pode quebrar, ele deve por &lt;a href="http://thinkabouttests.blogspot.com/2007/12/100-de-cobertura-at-quanto-isso.html"&gt;motivos estratégicos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A segunda resposta é: Aí depende. Depende da linguagem, da capacidade do desenvolvedor, do tempo, "beleza" do código, facilidade de manter, etc.&lt;br /&gt;&lt;br /&gt;Pra tentar deixar mais claro, vamos considerar duas possibilidades:&lt;br /&gt;&lt;br /&gt;- Testar Explicitamente o método privado;&lt;br /&gt;- Testar por intermédio de outro método.&lt;br /&gt;&lt;br /&gt;A primeira possibilidade, testar explicitamente, pode-se fazer duas coisas (que me vem a mente, mas podem existir outras):&lt;br /&gt;&lt;br /&gt;- Você pode trocar a visibilidade do método para public com Reflection, em tempo de execução;&lt;br /&gt;- Alterar o método para protected. Isso é mais complicado, em casos de código legado ou sistemas de outros.&lt;br /&gt;&lt;br /&gt;A segunda possibilidade, a que prefiro, é usar outro método "testável" para testar o método privado.&lt;br /&gt;&lt;br /&gt;Na prática, é muito fácil perceber isso, mas vai que você quer entender logo o que estou falando, então vai um exemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tenho uma classe com um método public (que retorna uma String) e um private, o método private (criptografa a palavra blablabla)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClassePeba &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"blablabla"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:   palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; criptografaPlavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; palavra&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;7:&lt;br /&gt;8:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; criptografaPalavra&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;9:    &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; i&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;10:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;i &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;11:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;12:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"a"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"b"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"!"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"l"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"?"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;else&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;16:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"a"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"b"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"$"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;18:    palavra &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; palavra&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;replace&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"l"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 230);"&gt;"%"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; palavra&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;22: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;O método private (criptografaPalavra) será testado por intermédio do método public getAlgo&lt;br /&gt;Veja os comentários no código:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestClassePeba &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2: ClassePeba classePeba&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:&lt;br /&gt;4:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;5:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; prepare&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;6:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7:   classePeba &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; ClassePeba&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;11:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testGetAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;12:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;13:   &lt;span style="color: rgb(105, 105, 105);"&gt;//fazendo este teste, o método getAlgo&lt;/span&gt;&lt;br /&gt;14:   &lt;span style="color: rgb(105, 105, 105);"&gt;//já está 100% coberto&lt;/span&gt;&lt;br /&gt;15:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"!?@!?@!?@"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;16:     getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:   &lt;span style="color: rgb(105, 105, 105);"&gt;//fazendo este teste, o método&lt;/span&gt;&lt;br /&gt;18:   &lt;span style="color: rgb(105, 105, 105);"&gt;//criptografaPalavra também fica 100% coberto&lt;/span&gt;&lt;br /&gt;19:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"$%*$%*$%*"&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; classePeba&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;20:     getAlgo&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;22: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&lt;/span&gt;&lt;/pre&gt;Acho que fica claro o motivo pelo qual, considero esta abordagem a mais indicada, ela é mais simples, fácil de implementar e de manter, e não a considero nem um pouco deselegante.&lt;br /&gt;&lt;br /&gt;ps. Por favor, não reparem o método de criptografar, criei só pra demonstração.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2183926775818229904?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2183926775818229904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2183926775818229904'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/como-testar-um-mtodo-privado.html' title='Como testar um Método Privado?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-6748528887341109777</id><published>2007-12-19T03:52:00.000-08:00</published><updated>2008-02-18T15:29:40.944-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cruise Control'/><title type='text'>CruiseControl - Automatizando minha Integração Continua</title><content type='html'>Ouvi muito se falar de &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt;, até mesmo aqui na empresa já estudamos a sua viabilidade. Mas, o que eu ganho com isso?&lt;br /&gt;&lt;br /&gt;Uma integração "simples": test, backup, update, test, commit, pode ser executada com um botão ao lado do commit, então não dou "cliques a mais".&lt;br /&gt;&lt;br /&gt;Mas lá vem uma vantagem, não preciso esperar a &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;integração &lt;/a&gt;acontecer, sendo que ela pode demorar um pouco, aqui na empresa ela dura mais ou menos 5 minutos.&lt;br /&gt;&lt;br /&gt;E como ouvi alguem me dizer, "sua maior força é sua maior fraqueza", então: a vantagem descrita acima acarreta no maior defeito, em minha opinião, de Automatizar a minha &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Integração Contínua&lt;/a&gt;, o feedback rápido é perdido.&lt;br /&gt;&lt;br /&gt;Eu posso configurar o CruiseControl para me avisar mais rapidamente, posso saber 1 minutos após dar um erro, porém, mas se você estiver fazendo a integração "na mão" e o erro acontecer, você o corrigirá imediatamente.&lt;br /&gt;&lt;br /&gt;E caso o gerente receba um email que a integração quebrou, duvido que ele diga, "parem o que esta sendo feito e verifiquem a integração".&lt;br /&gt;&lt;br /&gt;Pior que isso, mesmo que o gerente peça para corrigir, é que se duas pessoas jogarem erros que provoquem "quebra" na integração, a pessoa que for corrigi-la pode conhecer apenas um dos erros e a demora para a correção desses erros é maior que seria caso a Integração fosse feita "na mão".&lt;br /&gt;&lt;br /&gt;A dificuldade de correção pode acarretar num grande problema, o repositório pode ficar muito tempo quebrado.&lt;br /&gt;&lt;br /&gt;O Vinícius da &lt;a href="http://www.improveit.com.br/"&gt;ImproveIT &lt;/a&gt;escreveu num post sobre &lt;a href="http://blog.improveit.com.br/articles/2007/10/11/barrigas-abertas"&gt;Barrigas Abertas&lt;/a&gt; a seguinte frase: "Nos projetos que eu conheci, que utilizavam CruiseControl, era comum o repositório estar quebrado.", isso já me parece motivo suficiente para não usar essa Automatização.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dois bons links sobre Integração Contínua e CruiseControl:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.improveit.com.br/xp/praticas/integracao"&gt;http://www.improveit.com.br/xp/praticas/integracao&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblogs.pontonetpt.com/contracorrente/posts/2008.aspx"&gt;http://weblogs.pontonetpt.com/contracorrente/posts/2008.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-6748528887341109777?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6748528887341109777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6748528887341109777'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/cruisecontrol-automatizando-minha.html' title='CruiseControl - Automatizando minha Integração Continua'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3277714441951770435</id><published>2007-12-18T03:57:00.000-08:00</published><updated>2008-02-14T08:41:20.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>Livros sobre Testes (em inglês)</title><content type='html'>Muita gente procura referencias para estudar testes, e numa lista de discussão sobre Java indicaram o site &lt;a href="http://www.flazx.com/"&gt;flazx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Como não me pareceu pirataria, até por ter o link para comprar na &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; e tal, listei aqui em baixo, alguns livros sobre testes que tratam de assuntos bem interessantes:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook2330.php"&gt;http://www.flazx.com/ebook2330.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook2721.php"&gt;http://www.flazx.com/ebook2721.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook4275.php"&gt;http://www.flazx.com/ebook4275.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook8592.php"&gt;http://www.flazx.com/ebook8592.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook2630.php"&gt;http://www.flazx.com/ebook2630.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flazx.com/ebook1369.php"&gt;http://www.flazx.com/ebook1369.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com as férias chegando, esta é uma boa oportunidade para aperfeiçoar, aprender ou conhecer algo mais sobre testes.&lt;br /&gt;&lt;br /&gt;* Também é uma boa oportunidade de estudar Inglês.&lt;br /&gt;&lt;br /&gt;Valeu a dica, Barroso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3277714441951770435?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3277714441951770435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3277714441951770435'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/livros-sobre-testes-em-ingls.html' title='Livros sobre Testes (em inglês)'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-133481835201385775</id><published>2007-12-18T03:23:00.001-08:00</published><updated>2008-03-17T09:11:46.981-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>TDD - Auxiliando a desenvolver consultas com Hibernate + Spring</title><content type='html'>Quando usamos sql "puro", testar uma consulta é muito simples de ser feito, pois podemos utilizar uma ferramenta de BD como o MySQL Admin, ou PGAdmin, porém quando usamos APIs de Persistência, o problema aparece.&lt;br /&gt;&lt;br /&gt;Esses dias, num caso de uso que necessitava de uma consulta nem tão complexa, tive que startar e re-startar o servidor de aplicação 8 vezes, para testar a consulta que era montada.&lt;br /&gt;&lt;br /&gt;Daí, fiquei pensando se TDD poderia me ajudar, e ví que ele pode me ajudar e muito.&lt;br /&gt;&lt;br /&gt;Usando TDD para o desenvolvimento de uma consulta, além de diminuir o tempo perdido com o servidor de aplicação sendo levantado e derrubado várias vezes, ainda ganho o tempo de abrir a aplicação, preencher campos (como um filtro por exemplo) e submeter um formulário.&lt;br /&gt;&lt;br /&gt;Para fazermos TDD com consultas, precisamos gerenciar as transações para garantir que determinadas informações estarão na base de dados e outras não sejam persistidas.&lt;br /&gt;&lt;br /&gt;Utilizando Hibernate + Spring precisamos extender a classe AbstractTransactionalSpringContextTests do Spring, para gerenciar as transações.&lt;br /&gt;&lt;br /&gt;   extends AbstractTransactionalSpringContextTests&lt;br /&gt;&lt;br /&gt;No método de testes devemos escrever o método getConfigLocations para carregar os arquivos de contexto do Spring:&lt;br /&gt;&lt;pre&gt;0: @Override&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;protected&lt;/span&gt; String[] getConfigLocations()&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:  setAutowireMode&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;AUTOWIRE_BY_NAME&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;String&lt;/span&gt; &lt;span style="color: rgb(128, 128, 48);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;]&lt;/span&gt; &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 0, 230);"&gt;"applicationContext*.xml"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;No método de teste, você insere registros para simular um banco de dados populado:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void testGetAvisosMesAno()&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  Aviso a1 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Aviso&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3:  a1&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;L&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  a1&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setData&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;107&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;11&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6:  Aviso a2 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Aviso&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:  a2&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;L&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  a2&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setData&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;107&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:&lt;br /&gt;10:  Aviso a3 &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; Aviso&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;11:  a3&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setId&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;L&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;12:  a3&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;setData&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;107&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;11&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;20&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;13:&lt;br /&gt;14:  avisoDao&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;save&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;a1&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;15:  avisoDao&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;save&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;a2&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;16:  avisoDao&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;save&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;a3&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;17:&lt;br /&gt;18:  &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Collection&lt;/span&gt; avisos &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; avisoDao&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;19:   getAvisosMesAno&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;107&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;11&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;20:     &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119); font-weight: bold;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;107&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;11&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;21:  assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; avisos&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;size&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;22: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Se já existirem dados no banco, o tamanho do retorno (avisos.size()) não é um bom teste, é melhor verificar se os elemento que deseja, estão lá, e se os que não deseja, não estão.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A lição que deve ser deixada é que TDD é tão ou mais útil para um método de persistência do que para um método de negócio.&lt;br /&gt;O "ou mais" é o que acho que se encaixa melhor, pois imagine a possibilidade de errar na criação de uma consulta, além de tudo, usamos muito "palavras" que não são compiladas, como o nome de campos da sua classe.&lt;br /&gt;&lt;br /&gt;Outra dica é que mesmo usando SQL puro, o TDD pode conduzir muito bem a construção da sua query, e acho que mesmo sendo fácil testar a consulta com outras ferramentas, o TDD pode trazer mais benefícios do que, simplesmente, testar a consulta.&lt;br /&gt;Veja também o post sobre &lt;a href="http://thinkabouttests.blogspot.com/2007/12/100-de-cobertura-at-quanto-isso.html"&gt;100% de Cobertura&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-133481835201385775?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/133481835201385775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/133481835201385775'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/tdd-auxiliando-desenvolver-consultas.html' title='TDD - Auxiliando a desenvolver consultas com Hibernate + Spring'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8792901717320054857</id><published>2007-12-14T07:59:00.000-08:00</published><updated>2008-12-09T03:21:36.407-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='static method'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><category scheme='http://www.blogger.com/atom/ns#' term='JMockit'/><title type='text'>JMockit - Mockando um Método Estático</title><content type='html'>É com grande felicidade que consegui, nesta manhã de sexta, mockar um método estático, p&amp;amp;#@ que p@$%&amp;amp;, sensacional.&lt;br /&gt;&lt;br /&gt;O nome do cara é &lt;a href="https://jmockit.dev.java.net/"&gt;JMockit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bem, o meu exemplo é bem simples:&lt;br /&gt;&lt;br /&gt;Criei uma classe que tem somente um método estático, é esta classe que quero mockar:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseUtil &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; metodoEstatico&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Então, uma classe que utiliza este método:&lt;br /&gt;&lt;pre&gt;0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseFuncionalidade &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; metodoLocal&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;metodoEstatico&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Por fim, a classe de teste:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; ClasseFuncionalidadeTeste&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;1:&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; MockClasseUtil&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:   &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;int&lt;/span&gt; metodoEstatico&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;4:   &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;5:    &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;7:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;8:&lt;br /&gt;9:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Before&lt;br /&gt;10:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; prepare&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;11:   Mockit&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;redefineMethods&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;12:     ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;13:     MockClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;15:&lt;br /&gt;16:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;After&lt;br /&gt;17:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; finalize&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;18:   Mockit&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;restoreAllOriginalDefinitions&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;19:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;20:&lt;br /&gt;21:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;22:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; metodoLocal&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;23:   assertEquals&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; ClasseFuncionalidade&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;24:     metodoLocal&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;25:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;26: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Perceba que criei uma outra classe (inner class) chamada MockClasseUtil, com um método (metodoEstatico) de mesma assinatura do método da classe ClasseUtil, porém o retorno é diferente (No original é 1 e no falso é 0).&lt;br /&gt;&lt;br /&gt;Redefino os métodos da classe real pelos da classe mock:&lt;br /&gt;&lt;pre&gt;0: @Before&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void prepare()&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  Mockit&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;redefineMethods&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;br /&gt;3:    ClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;4:     MockClasseUtil&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Se fosse no JUnit3, poderia usar o método setUp para invocar o redefineMethods.&lt;br /&gt;&lt;br /&gt;E para voltar "ao normal":&lt;br /&gt;&lt;pre&gt;0: @After&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; void finalize()&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  Mockit&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;restoreAllOriginalDefinitions&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;3: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;A única dificuldade foi "ver" que o comando "-javaagent:jmockit.jar" deve ser passado como parâmetro para a JVM:&lt;br /&gt;&lt;br /&gt;No eclipse é só fazer isso, na hora de rodar o teste:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4x-irBbGvFc/R2Kpz5YNkdI/AAAAAAAAABg/rBsvO2BGSoA/s1600-h/parametro+jmockit.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_4x-irBbGvFc/R2Kpz5YNkdI/AAAAAAAAABg/rBsvO2BGSoA/s320/parametro+jmockit.JPG" alt="" id="BLOGGER_PHOTO_ID_5143860433451323858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ou isso, para rodar com test suite ou qualquer outro lugar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R2Kp5pYNkeI/AAAAAAAAABo/AJiTmtwyxxI/s1600-h/parametro+jmockit+jvm.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R2Kp5pYNkeI/AAAAAAAAABo/AJiTmtwyxxI/s320/parametro+jmockit+jvm.JPG" alt="" id="BLOGGER_PHOTO_ID_5143860532235571682" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8792901717320054857?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8792901717320054857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8792901717320054857'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/jmockit-mockando-um-mtodo-abstrato.html' title='JMockit - Mockando um Método Estático'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4x-irBbGvFc/R2Kpz5YNkdI/AAAAAAAAABg/rBsvO2BGSoA/s72-c/parametro+jmockit.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8217812080184963423</id><published>2007-12-13T08:45:00.000-08:00</published><updated>2008-03-17T09:21:27.314-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JUnit4'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='TestSuite'/><title type='text'>JUnit4 - Suite de Testes</title><content type='html'>Para provar, ainda mais, que o JUnit4 veio "apaixonado" por annotations, lá vai mais uma da série: JUnit4 - Novidades e Melhorias.&lt;br /&gt;&lt;br /&gt;Vou mostrar um exemplo de TestSuite nas duas versões, isso tornará a explicação clara:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para criar uma suite de testes com JUnit3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; AllTests &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;extends&lt;/span&gt; TestSuite&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;static&lt;/span&gt; TestSuite suite&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;4:   TestSuite suite &lt;span style="color: rgb(128, 128, 48);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; TestSuite&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;5:&lt;br /&gt;6:   suite&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;addTestSuite&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;ClasseFuncionalidadeTeste&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;7:   suite&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;addTestSuite&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;CopyOfClasseFuncionalidadeTeste&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;&lt;br /&gt;8: class&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;9:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Agora, com JUnit4:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;0: @RunWith(value=Suite.class)&lt;br /&gt;1: @SuiteClasses(value=&lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;2:  ClasseFuncionalidadeTeste&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt;&lt;br /&gt;3:  CopyOfClasseFuncionalidadeTeste&lt;span style="color: rgb(128, 128, 48);"&gt;.&lt;/span&gt;class&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;5: )&lt;br /&gt;6: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; TestAll &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;7: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;Bem, com JUnit4, a classe "suite" só existe para "receber" a annotation e ser executada, não necessitando de nenhum método.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8217812080184963423?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8217812080184963423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8217812080184963423'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/junit4-suite-de-testes.html' title='JUnit4 - Suite de Testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-139810146909187361</id><published>2007-12-10T03:14:00.000-08:00</published><updated>2008-03-17T09:24:01.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JUnit4'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><title type='text'>JUnit4 - Novidades e Melhorias</title><content type='html'>Neste fim de semana estava trabalhando em uma aplicação pessoal e tentei usar o &lt;a href="http://www.junit.org/"&gt;JUnit4&lt;/a&gt; para criar meus testes.&lt;br /&gt;&lt;br /&gt;Primeiro que tive uma surpresa ótima, os meus métodos de teste criados para JUnit3 funcionam no &lt;a href="http://www.junit.org/"&gt;JUnit4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.junit.org/"&gt;JUnit4&lt;/a&gt; veio com uma aplicação muito forte de Annotations, irei listar as que vi e percebi serem de maior importância:&lt;br /&gt;&lt;br /&gt;@Test - O &lt;a href="http://www.junit.org/"&gt;JUnit4&lt;/a&gt; somente necessita da annotation @Test para identificar um método de teste.&lt;br /&gt;@Before e @After - Outras novidades são as annotations @Before e @After, como o nome já diz, são métodos invocados antes e depois dos métodos de teste.&lt;br /&gt;&lt;br /&gt;Ainda sobre a annotation @Test, esta recebe parâmetros e 2 que descobri são realmente incríveis:&lt;br /&gt;&lt;br /&gt;expected - este parâmetro serve para testar Exception, somente é necessário informar na annotation qual Exception é esperada e pronto: @Test(expected=IOException.class).&lt;br /&gt;timeout - este serve testar tempo de execução do teste, onde o teste falha se demorar mais que o tempo informado: @Test(timeout=2000).&lt;br /&gt;&lt;br /&gt;Com &lt;a href="http://www.junit.org/"&gt;JUnit4&lt;/a&gt;, uma classe de teste não extende TestCase e seus métodos não precisam começar com "test", como já foi dito, usa-se @Test.&lt;br /&gt;&lt;br /&gt;Foram adicionados 2 novos asserts:&lt;br /&gt;&lt;br /&gt;O assertEquals com um par de arrays que podem ser passados como parâmetro, desta forma o método verifica cada elemento: assertEquals(Object[] o1, Object[] o2);&lt;br /&gt;E o assertEquals que recebe um primeiro parâmetro String e um par de arrays, este primeiro parâmetro aparece ao lado do erro, caso o teste falhe, permitindo a identificação da linha exata onde o teste falhou: assertEquals(String message, Object[] obj1, Object[] obj2);&lt;br /&gt;&lt;br /&gt;Um exemplo básico e que mostra o que deve ser feito para que sua classe de teste feita em JUnit3 se adeque a nova versão do JUnit:&lt;br /&gt;&lt;pre&gt; 0: &lt;span style="color: rgb(105, 105, 105);"&gt;//Com JUnit3&lt;/span&gt;&lt;br /&gt;1: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; HelloWorld &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;extends&lt;/span&gt; TestCase&lt;br /&gt;2: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;3:  &lt;span style="color: rgb(105, 105, 105);"&gt;//necessita do prefixo "test"&lt;/span&gt;&lt;br /&gt;4:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testSoma&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;5:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;6:   &lt;span style="color: rgb(105, 105, 105);"&gt;// Testa se 1+1=2:&lt;/span&gt;&lt;br /&gt;7:   assertEquals &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;8:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;9: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;10:&lt;br /&gt;11: &lt;span style="color: rgb(105, 105, 105);"&gt;//Com JUnit4&lt;/span&gt;&lt;br /&gt;12: &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; HelloWorld &lt;span style="color: rgb(105, 105, 105);"&gt;//Não extend TestCase&lt;/span&gt;&lt;br /&gt;13: &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;14:  &lt;span style="color: rgb(128, 128, 48);"&gt;@&lt;/span&gt;Test&lt;br /&gt;15:  &lt;span style="color: rgb(105, 105, 105);"&gt;//não precisa ter este nome, poderia ser soma()&lt;/span&gt;&lt;br /&gt;16:  &lt;span style="color: rgb(128, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(187, 121, 119);"&gt;void&lt;/span&gt; testSoma&lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;br /&gt;17:  &lt;span style="color: rgb(128, 0, 128);"&gt;{&lt;/span&gt;&lt;br /&gt;18:   &lt;span style="color: rgb(105, 105, 105);"&gt;// Testa se 1+1=2:&lt;/span&gt;&lt;br /&gt;19:   assertEquals &lt;span style="color: rgb(128, 128, 48);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 140, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 48);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;;&lt;/span&gt;&lt;br /&gt;20:  &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;br /&gt;21: &lt;span style="color: rgb(128, 0, 128);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-139810146909187361?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/139810146909187361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/139810146909187361'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/junit4-novidades-e-melhorias.html' title='JUnit4 - Novidades e Melhorias'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3297990681325843348</id><published>2007-12-07T11:41:00.000-08:00</published><updated>2008-02-14T08:44:00.405-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='100% de Cobertura'/><title type='text'>100% de Cobertura - Até quanto isso é importante?</title><content type='html'>Existe um embate violento sobre este assunto, outro dia participei de uma discussão na xp-rio (ótima lista de discussão sobre XP), com alguns feras do XP no brasil sobre isso. Bem, é certo que fazer testes é importante, mas devo usar a métrica de 100% de cobertura?&lt;br /&gt;&lt;br /&gt;Vi várias opiniões, a minha começou com: "Só devo cobrir os métodos mais complicados", depois ouvi uma boa argumentação que me fez pensar assim: "Só devo cobrir o que pode quebrar". Desta forma, um método que apenas chama outro, não terá nenhum teste. Mas ele precisa?&lt;br /&gt;&lt;br /&gt;Prefiro dizer que ele "não precisa", pois se algo fizer este método quebrar, o compilador me avisa.&lt;br /&gt;&lt;br /&gt;Então, conversando com o Tales (meu gerente e figura conhecida no meio ágil), percebi a necessidade de garantir a qualidade para o cliente, como nos métodos tradicionais é usado um CMMI ou MPS-Br ou ISO, as metodologias ágeis são carentes nessa área e vez por outra precisam de alguma métrica para mostrar a qualidade, e na minha opinião, ter 100% de linhas de código cobertas por testes, me garante MAIOR qualidade num produto do que CMMIs ou ISOs da vida.&lt;br /&gt;&lt;br /&gt;Por fim, este argumento não pôde ser rebatido, sabemos que testes são bons, e que se iremos perder 10 minutos, ou menos, fazendo um teste que nunca irá quebrar, e que será, no mínimo, parte de uma métrica de qualidade, por que não fazê-lo?&lt;br /&gt;&lt;br /&gt;Que fique claro que não concordo que um "teste ruim" seja melhor que não ter teste. Mas isso fica pra outra blogada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3297990681325843348?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3297990681325843348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3297990681325843348'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/100-de-cobertura-at-quanto-isso.html' title='100% de Cobertura - Até quanto isso é importante?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-295666968693065095</id><published>2007-12-06T03:20:00.000-08:00</published><updated>2008-04-17T07:48:17.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concrete Class'/><category scheme='http://www.blogger.com/atom/ns#' term='JMock'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>JMock versus Classes Concretas 2 - A Missão</title><content type='html'>Me recuperando da decepção da incompatibilidade de versões do JMock, ví que o JMock 1 pode mockar classes concretas.&lt;br /&gt;&lt;br /&gt;Baixei o jmock-cglib-version.jar, e fiz como diz no link abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jmock.org/jmock1-cglib.html"&gt;http://www.jmock.org/jmock1-cglib.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;e funcionou.&lt;br /&gt;&lt;br /&gt;A única limitação é que não pode ser uma classe final.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JMock acaba de recuperar seus pontos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks, Nat Pryce.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-295666968693065095?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/295666968693065095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/295666968693065095'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas-2-misso.html' title='JMock versus Classes Concretas 2 - A Missão'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-6604941495826135834</id><published>2007-12-05T15:16:00.000-08:00</published><updated>2008-12-09T03:21:37.125-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>TDD - Um exemplo prático</title><content type='html'>No início, via sempre o exemplo de validação de cpf, as vezes me pegava pensando, será que pra casos "não matemáticos" isso vai funcionar?&lt;br /&gt;&lt;br /&gt;Hoje, no trabalho, desenvolvendo um método bem simples, resolvi tirar os "print screen" pra postar aqui e mostrar pros iniciantes em TDD que o assunto em bem próximo da nossa realidade.&lt;br /&gt;&lt;br /&gt;Segue o exemplo abaixo:&lt;br /&gt;&lt;br /&gt;Dada uma Collection de AtoNormativo* e um objeto do tipo AtoNormativo, façamos um método que retorne a Collection de AtoNormativo excluindo o objeto passado.&lt;br /&gt;*AtoNormativo é uma classe e tem uma propriedade Long id.&lt;br /&gt;&lt;br /&gt;1) Crio o método retiraNorma passando uma Collection&lt;atonormativo&gt; e um AtoNormativo;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4x-irBbGvFc/R1cx5hK16pI/AAAAAAAAABI/DyDN4FS-Duc/s1600-h/tdd_1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_4x-irBbGvFc/R1cx5hK16pI/AAAAAAAAABI/DyDN4FS-Duc/s320/tdd_1.JPG" alt="" id="BLOGGER_PHOTO_ID_5140632363892861586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Crio o método testRetiraNorma, crio a Collection, adiciono 3 objetos do tipo AtoNormativo e chamo o método retiraNorma, passando um dos objetos inseridos, para ser retirado da Collection.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cx1RK16oI/AAAAAAAAABA/AzgLlftvWfU/s1600-h/tdd_2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cx1RK16oI/AAAAAAAAABA/AzgLlftvWfU/s320/tdd_2.JPG" alt="" id="BLOGGER_PHOTO_ID_5140632290878417538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Perceba que após chamar o método, testo se a Collection foi retornada com 2 elementos somente, se um objeto que não deve ter sido removido, não foi removido, e se um objeto que deve ter sido removido, foi removido.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Rodei o teste e deu erro. É o que deve acontecer, já que o método ainda retorna Null.&lt;br /&gt;Implemento o método.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cxwRK16nI/AAAAAAAAAA4/hukyRF7qPP0/s1600-h/tdd_3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cxwRK16nI/AAAAAAAAAA4/hukyRF7qPP0/s320/tdd_3.JPG" alt="" id="BLOGGER_PHOTO_ID_5140632204979071602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4) Rodo o teste e tudo ok.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cxpRK16mI/AAAAAAAAAAw/SjtYQBIzF-E/s1600-h/tdd_4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_4x-irBbGvFc/R1cxpRK16mI/AAAAAAAAAAw/SjtYQBIzF-E/s320/tdd_4.JPG" alt="" id="BLOGGER_PHOTO_ID_5140632084719987298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A barra verde no canto esquerdo superior da imagem é o sinal de sucesso.&lt;br /&gt;&lt;br /&gt;Pronto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Perceba que a sequência lógica se mantém, penso no que vou fazer, penso no que o método deve fazer, implemento e testo, porém, quando o teste é rodado, você não precisa mais rodar a aplicação, abrir uma determinada tela e executar um certa funcionalidade, o teste garante que, na situação que você pensou, o método irá funcionar.&lt;br /&gt;&lt;br /&gt;Perceba que o teste pode ser alterado, podem ser inseridos situações em que o objeto passado não está dentre os objetos da Collection, e isso pode ser feito, o teste não é final, ele sempre pode evoluir.&lt;/atonormativo&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-6604941495826135834?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6604941495826135834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6604941495826135834'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/tdd-um-exemplo-prtico.html' title='TDD - Um exemplo prático'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4x-irBbGvFc/R1cx5hK16pI/AAAAAAAAABI/DyDN4FS-Duc/s72-c/tdd_1.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-254756840889683689</id><published>2007-12-05T15:11:00.000-08:00</published><updated>2008-01-18T18:10:14.154-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>TDD - Desenvolvimento Orientado a Testes</title><content type='html'>Quando ouvi a primeira vez sobre Test Driven Development achei imoral, o quão ridículo pode parecer fazer testes antes de desenvolver uma funcionalidade?&lt;br /&gt;&lt;br /&gt;Bem, o negócio não é tão feio quanto parece, fazer TDD te ajuda em muita coisa.&lt;br /&gt;&lt;br /&gt;Outro dia eu estava fazendo um Caso de Uso relacionado a uma loja virtual, onde deveria retornar vários valores de acordo com os produtos comprados.&lt;br /&gt;&lt;br /&gt;Comecei fazendo o Teste:&lt;br /&gt;&lt;br /&gt;Primeiro Passo: Gerei a classe de teste e criei somente a assinatura do método.&lt;br /&gt;Segundo Passo: Fiz as simulações necessárias numa calculadora e amarrei no teste, de acordo com a entrada a saída deveria ser... Óbvio que o teste ainda não funcionava.&lt;br /&gt;Terceiro Passo: Parti para a implementação, encontrei menos dificuldades do que imaginava, a lógica estava na minha cabeça, e quando imaginei ter terminado a funcionalidade, simplesmente rodei o teste.&lt;br /&gt;&lt;br /&gt;Corrigindo os erros que encontrei no teste e corrigindo o próprio teste, terminei a funcionalidade num tempo muito próximo ao tempo que faríamos sem teste, e o melhor é que a funcionalidade já estava testada, nem precisei abrir a tela pra testar cada situação.&lt;br /&gt;&lt;br /&gt;Confesso que existem alguma situações que o TDD não ajuda muito, como por exemplo, num método que somente chama outro método, nesses casos, eu prefiro varrer a classe após a implementação e fazer os testes que faltaram.&lt;br /&gt;&lt;br /&gt;Abuse do artifício dos Mock Objects, e experimente o TDD, os seus DEBUGs vão ser menos constantes e você terá a sensação de Casos de Uso concluídos de verdade.&lt;br /&gt;&lt;br /&gt;Vocês não imaginam a sensação que tive quando rodei minha classe de testes (haviam 18 simulações testadas) e a barrinha ficou verde.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ps. uso a primeira pessoa (encontrei, tive, Gerei, etc) mas tudo isso foi feito em dupla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-254756840889683689?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/254756840889683689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/254756840889683689'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/tdd-desenvolvimento-orientado-testes.html' title='TDD - Desenvolvimento Orientado a Testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-3045741356641181172</id><published>2007-12-05T12:46:00.000-08:00</published><updated>2008-02-18T15:30:15.660-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Concrete Class'/><category scheme='http://www.blogger.com/atom/ns#' term='JMock'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>JMock versus Classes Concretas</title><content type='html'>O JMock (acho que o EasyMock também) precisa de uma interface para ser instanciado, mas eu precisei usar com uma Classe Concreta.&lt;br /&gt;&lt;br /&gt;Sei que a primeira idéia é: "Porque você não cria uma interface?"&lt;br /&gt;&lt;br /&gt;No meu caso, até poderia, mas imagine um sistema legado, onde você esteja mantendo, criar uma interface e alterar um monte de classes talvez não seja o ideal.&lt;br /&gt;&lt;br /&gt;E isso me motivou a procurar uma solução para este problema, no site do JMock, encontrei uma referencia ao CGLib (links abaixo):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jmock.org/jmock1-cglib.html"&gt;http://www.jmock.org/jmock1-cglib.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jmock.org/mocking-classes.html"&gt;http://www.jmock.org/mocking-classes.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;algumas horas depois...&lt;br /&gt;&lt;br /&gt;Nas soluções acima, me parece que só funciona com o JMock 2, e aí vem a notícia mais triste que tive desde que comecei a fazer testes:&lt;br /&gt;&lt;br /&gt;Os testes feitos com JMock 1 não rodam se eu mudar o jar do JMock para a versão 2.&lt;br /&gt;&lt;br /&gt;Indo no site (&lt;a href="http://www.jmock.org/versioning.html"&gt;http://www.jmock.org/versioning.html&lt;/a&gt;) vi isso:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.0.0   Incompatible API changes, removes API elements deprecated by version 1.2.0.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bem, pra quem usa JMock 1 e não quer re-fazer TODOS os seus testes, crie uma interface para a classe que será mockada.&lt;br /&gt;&lt;br /&gt;O JMock acaba de perder 5 pontos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-3045741356641181172?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3045741356641181172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/3045741356641181172'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/jmock-versus-classes-concretas.html' title='JMock versus Classes Concretas'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-2949974915484795726</id><published>2007-12-04T13:11:00.000-08:00</published><updated>2008-12-09T03:21:37.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclEMMA'/><category scheme='http://www.blogger.com/atom/ns#' term='emma'/><title type='text'>EMMA - Auxiliando na cobertura de testes</title><content type='html'>Caras,&lt;br /&gt;&lt;br /&gt;o EMMA é uma ferramenta incrível para quem quer cobrir sua aplicação por testes, ela consiste em exibir relatórios de cobertura, indicando as linhas que não são cobertas, a porcentagem de cobertura, pacote e tudo mais.&lt;br /&gt;&lt;br /&gt;COBERTURA DE TESTES COM EMMA: &lt;a href="http://www.improveit.com.br/xp/praticas/tdd/emma"&gt;http://www.improveit.com.br/xp/praticas/tdd/emma&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pra quem usa eclipse, existe um plugin muito show, é o eclEMMA.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclemma.org/"&gt;http://www.eclemma.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vou mostrar um exemplo de utilização do eclEMMA.&lt;br /&gt;&lt;br /&gt;passo 1 (escolho uma classe para ver o quanto e onde ela esta coberta):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4x-irBbGvFc/R8RMJge-b0I/AAAAAAAAACY/7RpUp8vh_r4/s1600-h/classeasercoberta.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_4x-irBbGvFc/R8RMJge-b0I/AAAAAAAAACY/7RpUp8vh_r4/s320/classeasercoberta.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5171341998350561090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;passo 2 (seleciono a suite de testes):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4x-irBbGvFc/R8RMRQe-b1I/AAAAAAAAACg/nNa5glDNgH0/s1600-h/suite.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4x-irBbGvFc/R8RMRQe-b1I/AAAAAAAAACg/nNa5glDNgH0/s320/suite.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5171342131494547282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Passo 3 (e o resultado de uma classe 100% coberta):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4x-irBbGvFc/R8RMfQe-b3I/AAAAAAAAACw/uSlCN6vhEPY/s1600-h/100porccoberta.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_4x-irBbGvFc/R8RMfQe-b3I/AAAAAAAAACw/uSlCN6vhEPY/s320/100porccoberta.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5171342372012715890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enquanto lutava para cobrir linhas de código com meus testes, percebi que sem o eclEMMA seria muito mais difícil, por isso, indico fortemente o uso desta ferramenta.&lt;br /&gt;&lt;br /&gt;ps. credito a descoberta do plugin ao Igo Coelho, pois não tinha ouvido falar em lugar nenhum e o mesmo me apresentou.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-2949974915484795726?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2949974915484795726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/2949974915484795726'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/emma-auxiliando-na-cobertura-de-testes.html' title='EMMA - Auxiliando na cobertura de testes'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4x-irBbGvFc/R8RMJge-b0I/AAAAAAAAACY/7RpUp8vh_r4/s72-c/classeasercoberta.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-1824200657764062959</id><published>2007-12-04T03:08:00.001-08:00</published><updated>2008-02-14T08:50:00.968-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMock'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>Passagem de parâmetros para método mockado</title><content type='html'>Bem,&lt;br /&gt;&lt;br /&gt;quando você mocka uma classe, você deve informar, no método de teste, o que o método deve fazer, então, vejamos:&lt;br /&gt;&lt;br /&gt;classeDao.expects(once()).method("getAlgumaCoisa").&lt;br /&gt;with(eq(1), eq(true)).will(returnValue(obj));&lt;br /&gt;&lt;br /&gt;Traduzindo:&lt;br /&gt;&lt;br /&gt;A classeDao é um mock, e neste escopo (método de teste), ele será invocado 1 única vez (expects(once())), o método que será chamado é o getAlgumaCoisa (method("getAlgumaCoisa")), quando passar os parâmetros 1 e true (with(eq(1), eq(true))), retorne um Object obj (will(returnValue(obj))).&lt;br /&gt;&lt;br /&gt;Simples, porém me deparei com uma situação bem estranha:&lt;br /&gt;&lt;br /&gt;O método que eu estava testando, passava como parâmetro a data atual, e não o recebia como parâmetro. Bem, o problema é o fato do método instanciar um objeto e passar como parâmetro para outro método (que iremos mockar).&lt;br /&gt;&lt;br /&gt;Vou simplificar com um exemplo:&lt;br /&gt;&lt;br /&gt;Na classe classeManager&lt;br /&gt;&lt;br /&gt;o metodo fazAlgo():&lt;br /&gt;&lt;br /&gt;//faz um blablabla&lt;br /&gt;classeDao.getAlgumaCoisa(new String[]{"1", "2"});&lt;br /&gt;//faz o resto do blablabla&lt;br /&gt;&lt;br /&gt;no meu test:&lt;br /&gt;&lt;br /&gt;Estou testando a classe classeManager&lt;br /&gt;&lt;br /&gt;o método testFazAlgo():&lt;br /&gt;&lt;br /&gt;se eu fizer:&lt;br /&gt;&lt;br /&gt;classeDao.expects(once()).method("getAlgumaCoisa").&lt;br /&gt;with(eq(new String[]{"1", "2"})).will(returnValue(obj));&lt;br /&gt;&lt;br /&gt;não vai funcionar, ele vai me dizer que o método nunca foi invocado.&lt;br /&gt;&lt;br /&gt;Pra quem já estudou um pouco de O.O. já deve ter percebido, o objeto que instanciei na classe classeManager (classeDao.getAlgumaCoisa(new String[]{"1", "2"});) é diferente do instanciado na classe de testes (classeDao.expects(once()).method("getAlgumaCoisa").&lt;br /&gt;with(eq(new String[]{"1", "2"})).will(returnValue(obj));).&lt;br /&gt;&lt;br /&gt;Então a solução é:&lt;br /&gt;&lt;br /&gt;classeDao.expects(once()).method("getAlgumaCoisa").&lt;br /&gt;with(ANYTHING).will(returnValue(obj));&lt;br /&gt;&lt;br /&gt;o que quer dizer:&lt;br /&gt;&lt;br /&gt;Quando eu passar "Qualquer Coisa" (with(ANYTHING)) para o método getAlgumaCoisa, retorne o obj.&lt;br /&gt;&lt;br /&gt;Importante lembrar que a quantidade de parâmetros deve ser igual a do método "de verdade".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-1824200657764062959?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1824200657764062959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/1824200657764062959'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/passagem-de-parametros-para-mtodo.html' title='Passagem de parâmetros para método mockado'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-8080983522000361865</id><published>2007-12-03T13:53:00.000-08:00</published><updated>2008-02-14T08:50:17.932-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='easy mock'/><category scheme='http://www.blogger.com/atom/ns#' term='JMock'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>Quero usar mocks, uso JMock ou EasyMock?</title><content type='html'>Bem, já vi defensores das duas "ferramentas", eu prefiro o JMock, acho ele muito simples e bem funcional, de qualquer forma, vou colocar aqui os links para download dos dois:&lt;br /&gt;&lt;br /&gt;JMock: &lt;a href="http://www.jmock.org/"&gt;http://www.jmock.org/&lt;/a&gt;&lt;br /&gt;EasyMock: &lt;a href="http://www.easymock.org/"&gt;http://www.easymock.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se você quer começar com JMock: &lt;a href="http://www.jmock.org/getting-started.html"&gt;http://www.jmock.org/getting-started.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pra ver um caso simples das duas formas, isso pode ajudar a escolher: &lt;a href="http://blogs.warwick.ac.uk/colinyates/entry/jmock_versus_easymock/"&gt;http://blogs.warwick.ac.uk/colinyates/entry/jmock_versus_easymock/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aqui tem uma tabelinha com algumas diferenças: &lt;a href="http://www.tcay.com/dev/JMockVsEasyMock.htm"&gt;http://www.tcay.com/dev/JMockVsEasyMock.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-8080983522000361865?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8080983522000361865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/8080983522000361865'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/quero-usar-mocks-uso-jmock-ou-easymock.html' title='Quero usar mocks, uso JMock ou EasyMock?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-8609407431841595653.post-6435934439665253152</id><published>2007-12-03T13:34:00.000-08:00</published><updated>2008-02-14T08:47:59.482-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='mock objects'/><title type='text'>O que devo saber pra começar a fazer testes?</title><content type='html'>Inicialmente, aconselho estudar JUnit, que é uma ferramenta excelente para fazer &lt;a href="http://thinkabouttests.blogspot.com/2008/01/teste-unitrio-como-definir-o-seu-escopo.html"&gt;testes unitários&lt;/a&gt; em Java e se integra com o Eclipse, Netbeans e qualquer outra IDE que mereça respeito.&lt;br /&gt;&lt;br /&gt;Como os casos de uso evoluem e a complexidade dos testes acompanha, aconselho estudar Mock Objects.&lt;br /&gt;&lt;br /&gt;Mocks são simulações de objetos, fazendo com que seus testes fiquem presos a um determinado escopo, por exemplo, se você esta fazendo um teste em uma classe de negócio e o método desta classe invoca um método de outra classe que faz uma consulta no banco, você deve usar um Mock para simular o objeto desta outra classe, simulando assim esta consulta, pois a consulta será testada no momento em que o teste para o seu método for criado.&lt;br /&gt;&lt;br /&gt;Com isso você pode começar a fazer testes de seus métodos.&lt;br /&gt;&lt;br /&gt;No site da ImproveIT existem vários materiais para estudo no assunto, vou linkar aqui em baixo dois textos bem legais:&lt;br /&gt;&lt;br /&gt;Um pouco de TDD, é apresentado um exemplo com JUnit: &lt;a href="http://www.improveit.com.br/xp/praticas/tdd"&gt;http://www.improveit.com.br/xp/praticas/tdd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mock Objects, você pode dar uma lida e ter uma boa idéia sobre o assunto: &lt;a href="http://www.improveit.com.br/xp/praticas/tdd/mock_objects"&gt;http://www.improveit.com.br/xp/praticas/tdd/mock_objects&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8609407431841595653-6435934439665253152?l=thinkabouttests.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6435934439665253152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8609407431841595653/posts/default/6435934439665253152'/><link rel='alternate' type='text/html' href='http://thinkabouttests.blogspot.com/2007/12/o-que-devo-saber-pra-comear-fazer.html' title='O que devo saber pra começar a fazer testes?'/><author><name>Rodrigo Maia</name><uri>http://www.blogger.com/profile/17875840292581106029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_4x-irBbGvFc/R1RzDxK16hI/AAAAAAAAAAM/ee5lCLxBiVc/S220/DSC07193.JPG'/></author></entry></feed>
