<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>victor serta  /blog</title><link>http://victorserta.com.br/blog</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/victorvserta" /><description>meu blog pessoal sobre tecnologia</description><language>en</language><lastBuildDate>Tue, 14 Feb 2012 14:55:28 PST</lastBuildDate><generator>http://wordpress.org/?v=3.2.1</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/victorvserta" /><feedburner:info uri="victorvserta" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Mock de métodos estáticos em Java</title><link>http://feedproxy.google.com/~r/victorvserta/~3/0ivvFKkYhBY/</link><category>Java</category><category>XP</category><category>mock</category><category>powermock</category><category>tdd</category><category>unit test</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Thu, 19 Jan 2012 03:32:18 PST</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=890</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a target="_blank" href="http://code.google.com/p/powermock/"><img src="http://victorserta.com.br/blog//wp-content/uploads/2012/01/powermock.png" alt="Logo PowerMock" title="PowerMock" width="279" height="140" class="aligncenter size-full wp-image-892" /></a></p>
<p>A utilização de <strong>métodos estáticos</strong>, na maioria dos casos, deve ser evitada por dificultar os testes unitários e criar um alto acoplamento. Mas se você se deparar com um <strong>método estático</strong> e tiver que sobrescrever seu comportamento para implementar <strong>testes unitários</strong> utilizando a técnica <strong>Mock Objects</strong>, indico a ferramenta <a target="_blank" href="http://code.google.com/p/powermock/" target="_blank"><strong>PowerMock</strong></a>. </p>
<p>Esse framework permite a criação de mocks de métodos marcados com <strong>static</strong> ou até mesmo <strong>final</strong>. O <a target="_blank" href="http://code.google.com/p/powermock/" target="_blank"><strong>PowerMock</strong></a> é utilizado como uma extensão de outras ferramentas de mock, como o <a target="_blank" href="http://easymock.org/" target="_blank"><strong>EasyMock</strong></a> e o <a target="_blank" href="http://code.google.com/p/mockito/" target="_blank"><strong>Mockito</strong></a>.</p>
<h3>Exemplo</h3>
<p>O trecho de código abaixo retirado <a target="_blank" href="http://code.google.com/p/powermock/source/browse/trunk/modules/module-test/easymock/junit4-test/src/test/java/samples/junit4/singleton/MockStaticTest.java" target="_blank">deste exemplo</a>, demonstra como utilizar o <strong>PowerMock</strong> com o <strong>EasyMock</strong>:</p>
<pre>
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import samples.singleton.StaticService;

import static org.easymock.EasyMock.expect;
import static org.junit.Assert.*;
import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest( { StaticService.class })
public class MockStaticTest {

 @Test
 public void testMockStatic() throws Exception {
  mockStatic(StaticService.class);
  String expected = "Hello altered World";
  expect(StaticService.say("hello")).andReturn("Hello altered World");
  replay(StaticService.class);

  String actual = StaticService.say("hello");

  verify(StaticService.class);
  assertEquals("Expected and actual did not match", expected, actual);
 }
}
</pre>
<p>O método estático a ser &#8220;mockado&#8221; é o <i>say</i> da classe <i>StaticService</i>. Suponha que a implementação deste método retorna <i>&#8220;Hello World&#8221;</i>. O objetivo deste código de exemplo é sobrescrever o comportamento de <i>say</i> para retornar <i>&#8220;Hello altered World&#8221;</i> quando recebe <i>&#8220;hello&#8221;</i> como parâmetro.</p>
<p>A <b>linha 12</b> define o runner do <strong>PowerMock</strong> para o <strong>JUnit 4</strong> e a <b>linha 13</b> informa quais as classes que devem ser preparadas para o teste. Entre as <b>linhas 18</b> e <b>21</b> é definido o comportamento esperado para o metodo <i>say</i>, que é retornar <i>&#8220;Hello altered World&#8221;</i> quando receber <i>&#8220;hello&#8221;</i> como parâmetro. O método <i>say</i> é chamado na <b>linha 23</b> e retornará o valor definido, o que é verificado nas <b>linhas 25</b> e <b>26</b>. </p>
<p>A utilização do PowerMock é praticamente igual à do <strong>EasyMock</strong> padrão, com excessão do runner, da annotation  <strong><em>@PrepareForTest</em></strong> e da chamada do método <strong><em>mockStatic</em></strong>.</p>
<h3> Por que eu preciso disso?</h3>
<p>Um caso em que o <strong>PowerMock</strong> ajuda muito é quando foi utilizado o design pattern <strong>Singleton</strong> ou um <strong>Factory Method</strong> estático. Por exemplo, no código a seguir é chamado o método <i>getInstance</i> de <i>ServicoAutenticacao</i>. </p>
<pre>
public class LoginController {

 public void realizarLogin(String login, String senha) throws LoginInvalidoException {
  ServicoAutenticacao servicoAutenticacao = ServicoAutenticacao.getInstance();

  //faz algo...
 }
}
</pre>
<p>O problema é que para realizar os testes unitários você não deve utilizar a implementação real deste serviço, já que ele pode depender de recursos (banco de dados, LDAP, etc.) e é necessário sobrescrever seu comportamento para os testes. Com o <strong>PowerMock</strong> você sobrescreve o método estático para retornar uma implementação fake do serviço ou um <strong>mock object</strong>.</p>
<p>O ideal neste caso seria substituir o método estático por uma <a href="http://victorserta.com.br/blog/2011/06/29/injecao-de-dependencia-em-java/" target="_blank"><strong>Injeção de Dependência</strong></a>, porém isso não é possível se você estiver utilizando uma API ou framework que tenha uma chamada desse tipo.</p>
<h3>Instalação</h3>
<p>A página <a target="_blank" href="http://code.google.com/p/powermock/wiki/GettingStarted" target="_blank">Getting Started</a> da wiki do projeto explica como adicionar a biblioteca em seu projeto, utilizando o Maven ou não.</p>
<h3>Referências</h3>
<ul>
<li><a target="_blank" href="http://code.google.com/p/powermock/" target="_blank">Site do projeto PowerMock</a></li>
<li><a target="_blank" href="http://easymock.org/">Site do projeto EasyMock</a></li>
<li><a target="_blank" href="http://code.google.com/p/mockito/">Site do projeto Mockito</a></li>
<li><a target="_blank" href="http://improveit.com.br/xp/praticas/tdd/mock_objects">Testes com Mock Objects &#8211; Inprove It</a></li>
<li><a target="_blank" href="http://blog.jayway.com/2009/05/17/mocking-static-methods-in-java-system-classes/">Mocking static methods in Java system classes</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=0ivvFKkYhBY:lQIIkYcLuA8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=0ivvFKkYhBY:lQIIkYcLuA8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>A utilização de métodos estáticos, na maioria dos casos, deve ser evitada por dificultar os testes unitários e criar um alto acoplamento. Mas se você se deparar com um método estático e tiver que sobrescrever seu comportamento para implementar testes unitários utilizando a técnica Mock Objects, indico a ferramenta PowerMock. Esse framework permite a criação [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2012/01/19/mock-de-metodos-estaticos-em-java/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2012/01/19/mock-de-metodos-estaticos-em-java/</feedburner:origLink></item><item><title>Android Design: Um guia para apps com melhor design e UX</title><link>http://feedproxy.google.com/~r/victorvserta/~3/Njojz-tGA_0/</link><category>Android</category><category>android</category><category>design</category><category>ux</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Thu, 12 Jan 2012 17:00:54 PST</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=860</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a target="_blank" href="http://developer.android.com/design/index.html" target="_blank"><img src="http://victorserta.com.br/blog//wp-content/uploads/2012/01/Screen-shot-2012-01-12-at-22.45.03.png" alt="Site Android Design" title="Site Android Design" width="578" height="414" class="aligncenter size-full wp-image-866" /></a></p>
<p>Foi <a target="_blank" href="http://android-developers.blogspot.com/2012/01/introducing-android-design-site.html" target="_blank">anunciado hoje (12/01/12)</a> o <a target="_blank" href="http://developer.android.com/design/index.html" target="_blank"><strong>Android Design</strong></a>, um site que possui diversas instruções e dicas de design e experiência do usuário para o desenvolvimento de aplicações para o <strong>Android 4.0</strong> (<strong>Ice Cream Sandwich</strong>).</p>
<p>A documentação é bem completa e está divida em <i>Get Started</i>, <i>Style</i>, <i>Patterns</i> e <i>Building Blocks</i>. Cada página possui imagens, textos explicativos e exemplos a serem seguidos.</p>
<p>Na minha opinião, este é um grande passo para a plataforma Android. A preocupação com design e UX nas aplicações para iOS atualmente é muito maior. Com a reformulação da UI no Ice Cream Sandwich e a criacão do <a target="_blank" href="http://developer.android.com/design/index.html" target="_blank"><strong>Android Design</strong></a>, o Google demonstra que quer acabar com essa desvantagem em relação ao seu rival.</p>
<p>E você, o que achou do <a target="_blank" href="http://developer.android.com/design/index.html" target="_blank"><strong>Android Design</strong></a>?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=Njojz-tGA_0:tolyBr0ISm0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=Njojz-tGA_0:tolyBr0ISm0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Foi anunciado hoje (12/01/12) o Android Design, um site que possui diversas instruções e dicas de design e experiência do usuário para o desenvolvimento de aplicações para o Android 4.0 (Ice Cream Sandwich). A documentação é bem completa e está divida em Get Started, Style, Patterns e Building Blocks. Cada página possui imagens, textos explicativos [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2012/01/12/android-design-um-guia-para-apps-com-melhor-design-e-ux/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2012/01/12/android-design-um-guia-para-apps-com-melhor-design-e-ux/</feedburner:origLink></item><item><title>BDD em aplicações web – JM 98</title><link>http://feedproxy.google.com/~r/victorvserta/~3/9UW27UFmCMM/</link><category>BDD</category><category>Desenvolvimento Ágil</category><category>Java</category><category>Scrum</category><category>agile</category><category>bdd</category><category>jbehave</category><category>selenium</category><category>tdd</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Wed, 14 Dec 2011 05:34:08 PST</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=826</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a target="_blank" href="http://www.devmedia.com.br/post-23078-Revista-Java-Magazine-98.html"><img class="alignleft size-full wp-image-840" style="margin-right: 10px;" title="Capa Java Magazine 98" src="http://victorserta.com.br/blog//wp-content/uploads/2011/12/capaJava98_m.jpg" alt="Capa Java Magazine 98" width="125" height="170" /></a>Foi publicado na <a target="_blank" href="http://www.devmedia.com.br/post-23078-Revista-Java-Magazine-98.html" target="_blank"><strong>Java Magazine</strong> <strong>98</strong></a> meu artigo <strong><a target="_blank" href="http://www.devmedia.com.br/post-23071-BDD-em-aplicacoes-Web.html" target="_blank">BDD em aplicações web</a> </strong>na seção <strong>Engenharia de Software</strong>. Neste artigo escrevo sobre a utilização da metodologia <strong>BDD</strong> (<strong>Behavior Driven Development</strong>) para o desenvolvimento de aplicações web com as ferramentas <strong>JBehave</strong> e <strong>Selenium</strong>.</p>
<p>Para quem não conhece, o <strong>BDD</strong> descreve os comportamentos do sistema em uma linguagem compreendida por todos os envolvidos do projeto (cliente, desenvolvedores, equipe de QA, etc.) e possibilita automatizar os testes de aceitação em aplicações web. Considerada por muitos a evolução do <strong>TDD</strong> (<strong>Test Driven Development</strong>), essa metologia é útil para equipes que utilizam metodologias ágeis no desenvolvimento de aplicações web.</p>
<p>Se você ainda não conhece essa metodologia ou ainda não aplicou ela integrada com o <strong>Selenium</strong>, dê uma conferida no meu artigo. Aguardo seu feedback <img src='http://victorserta.com.br/blog//wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a target="_blank" href="http://www.devmedia.com.br/post-23071-BDD-em-aplicacoes-Web.html" target="_blank">Leia o artigo na versão digital da revista</a></p>
<p>Agradeço ao <a target="_blank" href="https://twitter.com/#!/eduspinola" target="_blank">Eduardo Spínola</a> pelo convite para escrever na <strong>Java Magazine</strong>.</p>
<p>&nbsp;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=9UW27UFmCMM:KSWHMVfeQvI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=9UW27UFmCMM:KSWHMVfeQvI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Foi publicado na Java Magazine 98 meu artigo BDD em aplicações web na seção Engenharia de Software. Neste artigo escrevo sobre a utilização da metodologia BDD (Behavior Driven Development) para o desenvolvimento de aplicações web com as ferramentas JBehave e Selenium. Para quem não conhece, o BDD descreve os comportamentos do sistema em uma linguagem compreendida [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/12/14/bdd-em-aplicacoes-web-jm-98/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/12/14/bdd-em-aplicacoes-web-jm-98/</feedburner:origLink></item><item><title>Assista as gravações das palestras da #soudevcon</title><link>http://feedproxy.google.com/~r/victorvserta/~3/DyfJmhvTTqg/</link><category>Android</category><category>Eventos</category><category>Flex</category><category>Java</category><category>Outras linguagens</category><category>XP</category><category>.net</category><category>agile</category><category>android</category><category>evento</category><category>flex</category><category>html5</category><category>jquery</category><category>palestra</category><category>soudev</category><category>soudevcon</category><category>tdd</category><category>xp</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Wed, 19 Oct 2011 06:58:38 PDT</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=786</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a target="_blank" href="http://conference.soudev.com.br/" target="_blank"><img src="http://victorserta.com.br/blog//wp-content/uploads/2011/10/Screen-shot-2011-10-19-at-11.27.29-300x234.png" alt="Gravações palestras #soudevcon" title="Gravações das palestras #soudevcon" width="300" height="234" class="alignleft size-medium wp-image-787" /></a> Para quem perdeu o evento ou quer assistir de novo, as gravações das palestras que rolaram na primeira edição da <a target="_blank" href="http://conference.soudev.com.br/" target="_blank"><strong>#soudevcon</strong></a> já estão disponíveis.</p>
<p>A conferência aconteceu no último sábado (15/10/11) e contou com palestras muito interessantes sobre <strong>Android</strong>, <strong>Flex</strong>, <strong>.NET</strong>, <strong>Desenvolvimento de Jogos</strong>, <strong>HTML5</strong>, <strong>jQuery</strong> e também <a href="http://victorserta.com.br/blog/2011/10/15/desenvolvedor-no-controle-utilizando-tdd-soudevcon/"  target="_blank">minha palestra sobre <strong>TDD</strong></a>. </p>
<p>Assista as gravações e compartilhe para que a próxima edição da <a target="_blank" href="http://conference.soudev.com.br/" target="_blank"><strong>#soudevcon</strong></a> seja ainda melhor e com mais participantes.</p>
<p>Abaixo os links das <strong>gravações</strong>:</p>
<ul>
<li><a target="_blank" href="http://experts.adobeconnect.com/p1xig40l8mj/" title="Assistir gravação palestra Desenvolvedor no controle utilizando TDD" target="_blank">Desenvolvedor no controle utilizando TDD</a> (código-fonte e slides <a href="http://victorserta.com.br/blog/2011/10/15/desenvolvedor-no-controle-utilizando-tdd-soudevcon/" target="_blank">aqui</a>)</li>
<li><a target="_blank" href="http://experts.adobeconnect.com/p7t4q4ijjt4/" title="Assistir gravação palestra Plataforma Android" target="_blank">Plataforma Android</a></li>
<li><a target="_blank" href="http://experts.adobeconnect.com/p2bovuvyuw3/" title="Assistir gravação palestra Aplicações Flex + .NET Plataform + ADO.NET Entity Framework" target="_blank">Aplicações Flex + .NET Plataform + ADO.NET Entity Framework</a>
</li>
<li><a target="_blank" href="http://experts.adobeconnect.com/p3vp420k6cg/" title="Assistir gravação palestra Quero ser um desenvolvedor de Jogos" target="_blank">Quero ser um desenvolvedor de Jogos</a></li>
<li><a target="_blank" href="http://experts.adobeconnect.com/p89shml7quc/" title="Assistir gravação palestraArmazenamento local com WebStorage HTML5 target="_blank">Armazenamento local com WebStorage HTML5</a></li>
<li><a target="_blank" href="http://experts.adobeconnect.com/p7yswfdsvzs/" title="Assistir gravação palestra jQuery - Essencial" target="_blank">jQuery &#8211; Essencial</a></li>
</ul>
<p>A descrição de cada palestra você pode conferir no <a target="_blank" href="http://conference.soudev.com.br/" title="Site da #soudevcon" target="_blank">site oficial do evento</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=DyfJmhvTTqg:dai4HK0A_O8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=DyfJmhvTTqg:dai4HK0A_O8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Para quem perdeu o evento ou quer assistir de novo, as gravações das palestras que rolaram na primeira edição da #soudevcon já estão disponíveis. A conferência aconteceu no último sábado (15/10/11) e contou com palestras muito interessantes sobre Android, Flex, .NET, Desenvolvimento de Jogos, HTML5, jQuery e também minha palestra sobre TDD. Assista as gravações [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/10/19/assista-as-gravacoes-das-palestras-da-soudevcon/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/10/19/assista-as-gravacoes-das-palestras-da-soudevcon/</feedburner:origLink></item><item><title>Desenvolvedor no controle utilizando TDD #soudevcon</title><link>http://feedproxy.google.com/~r/victorvserta/~3/QtFkaAW5wZY/</link><category>Eventos</category><category>Java</category><category>XP</category><category>soudev</category><category>soudevcon</category><category>tdd</category><category>xp</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Sat, 15 Oct 2011 08:59:31 PDT</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=755</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Palestrei na primeira edição da <a target="_blank" href="http://conference.soudev.com.br/" title="Site da #soudevcon" target="_blank"><strong>#soudevcon</strong></a> falando sobre <strong>TDD</strong>. Para quem quiser dar uma olhada novamente nos slides e no código-fonte, disponibilizei eles no <a target="_blank" href="http://www.slideshare.net/victorserta/desenvolvedor-no-controle-utilizando-tdd" title="Slides no SlideShare" target="_blank">SlideShare</a> e no <a target="_blank" href="https://github.com/victorserta/exemplostdd/tree/master/controle_estoque_soudevcon" target="_blank">github</a>.</p>
<p><b><em>Atualizado em 19/10:</b> A gravação da palestra agora <a target="_blank" title="Assista a gravação" href="http://experts.adobeconnect.com/p1xig40l8mj/" target="_blank">também está disponível</a></em>.</p>
<p><b>Slides da palestra:</b></p>
<p style="text-align: center;"><object type='application/x-shockwave-flash' wmode='opaque' data='http://static.slideshare.net/swf/ssplayer2.swf?id=9713494&doc=desenvolvedornocontroleutilizandotdd-111015105123-phpapp02' width='425' height='348'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=9713494&doc=desenvolvedornocontroleutilizandotdd-111015105123-phpapp02' /><param name='allowFullScreen' value='true' /></object></p>
<p><b>Código-fonte: </b><br />
<a target="_blank" href="https://github.com/victorserta/exemplostdd/tree/master/controle_estoque_soudevcon" target="_blank">https://github.com/victorserta/exemplostdd/tree/master/controle_estoque_soudevcon</a></p>
<p><b>Gravação:</b><br />
<a target="_blank" title="Assista a gravação" href="http://experts.adobeconnect.com/p1xig40l8mj/" target="_blank">Clique para assistir</a><br />
<a target="_blank" title="Assista a gravação" href="http://experts.adobeconnect.com/p1xig40l8mj/" target="_blank"><img src="http://victorserta.com.br/blog//wp-content/uploads/2011/10/player_adobe_connect.png" alt="Player Adobe Connect" title="Assista a gravação" width="74" height="32" class="alignnone size-full wp-image-784" /></a></p>
<p><em><b>Curtiu a palestra ou tem alguma dúvida? Deixe seu comentário aqui e compartilhe no twitter. <img src='http://victorserta.com.br/blog//wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </b></em></p>
<p>Agradeço o feedback do pessoal no twitter após a palestra:</p>
<p><a target="_blank" href="https://twitter.com/#!/jandersonfc/status/125199865251770368" target="_blank">@jandersonfc</a>: <em>&#8220;excelente palestra so @victorserta sobre #tdd no #soudevcon #soudev &#8230; parabéns brother&#8221;</em></p>
<p><a target="_blank" href="https://twitter.com/#!/diogorosanelli/status/125199860327661568" target="_blank">@diogorosanelli</a>: <em>&#8220;Palestra do Victor Serta sobre #TDD show de bola no #soudevcon Parabéns ! 8)&#8221;</em></p>
<p><a target="_blank" href="https://twitter.com/#!/gilmarpalega/status/125199803385782272" target="_blank">@gilmarpalega</a>: <em>&#8220;Nota 10 para a palestra #TDD do @victorserta no #soudevcon #soudev&#8221;</em></p>
<p><a target="_blank" href="https://twitter.com/#!/lincolnpomper/status/125200628527005697" target="_blank">@lincolnpomper</a>: <em>&#8220;Peguei só o final da palestra sobre #TDD do @victorserta no #soudevcon mas parece que foi ótima como sempre.</em></p>
<p>Hashtags: <a target="_blank" href="https://twitter.com/#!/search/%23soudev" title="#soudev" target="_blank"><strong>#soudev</strong></a> <a target="_blank" href="https://twitter.com/#!/search/%23soudevcon" title="#soudevcon" target="_blank"><strong>#soudevcon</strong></a> <a target="_blank" href="https://twitter.com/#!/search/%23tdd" title="#tdd" target="_blank"><strong>#tdd</strong></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=QtFkaAW5wZY:uyIZIx0ruNs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=QtFkaAW5wZY:uyIZIx0ruNs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Palestrei na primeira edição da #soudevcon falando sobre TDD. Para quem quiser dar uma olhada novamente nos slides e no código-fonte, disponibilizei eles no SlideShare e no github. Atualizado em 19/10: A gravação da palestra agora também está disponível. Slides da palestra: Código-fonte:  https://github.com/victorserta/exemplostdd/tree/master/controle_estoque_soudevcon Gravação: Clique para assistir Curtiu a palestra ou tem alguma dúvida? [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/10/15/desenvolvedor-no-controle-utilizando-tdd-soudevcon/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/10/15/desenvolvedor-no-controle-utilizando-tdd-soudevcon/</feedburner:origLink></item><item><title>#soudevcon em 15/10/11: Conferência online de para desenvolvedores</title><link>http://feedproxy.google.com/~r/victorvserta/~3/SQtjKXU3nvc/</link><category>Android</category><category>Eventos</category><category>Flex</category><category>XP</category><category>android</category><category>evento</category><category>flex</category><category>git</category><category>html5</category><category>jquery</category><category>soudev</category><category>soudevcon</category><category>tdd</category><category>xp</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Mon, 10 Oct 2011 04:40:13 PDT</pubDate><guid isPermaLink="false">http://victorserta.com.br/blog/?p=734</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>No próximo sábado (15/10/11) acontecerá o evento <a target="_blank" href="http://conference.soudev.com.br/" target="_blank"><strong>#soudevcon</strong></a>, uma conferência online de desenvolvedores para desenvolvedores. Este será o primeito evento online e grátis da comunidade <a target="_blank" href="https://twitter.com/#!/search/%23soudev" target="_blank"><strong>#soudev</strong></a>. </p>
<p><img src="http://victorserta.com.br/blog//wp-content/uploads/2011/10/logo_soudevcon_2011-300x107.png" alt="logo #soudevcon" title="Logo Soudevcon 15/10/2011" width="300" height="107" class="aligncenter size-medium wp-image-740" /></p>
<p>Eu irei palestrar no evento falando sobre <strong>TDD</strong>. Dê uma conferida na descrição da minha palestra:</p>
<h5>Desenvolvedor no controle utilizando TDD</h5>
<p>Nessa palestra apresentarei o que é <strong>TDD</strong> (<strong>Test Driven Development</strong>) e seus conceitos de forma muito prática. Essa técnica ajuda a produção de softwares com mais qualidade e coloca o desenvolvedor realmente no controle do código. Assim você se livra das longas sessões de debug, códigos incompreensíveis e arquiteturas no estilo &#8220;matar uma formiga com um canhão&#8221;.</p>
<h4>Agenda</h4>
<p>Abaixo a grade com os horários de todas palestras que vão rolar no evento:</p>
<p>08:30 &#8211; 09:00 &#8211; Abertura da Conferência Soudev<br />
09:00 &#8211; 10:15 &#8211; Desenvolvedor no controle utilizando TDD<br />
10:15 &#8211; 11:30 &#8211; Git na prática<br />
11:30 &#8211; 12:45 &#8211; Plataforma Android<br />
14:00 &#8211; 15:15 &#8211; Aplicações Flex + .NET Plataform + ADO.NET Entity Framework<br />
15:15 &#8211; 16:30 &#8211; Quero ser um desenvolvedor de Jogos<br />
16:30 &#8211; 17:45 &#8211; Armazenamento local com WebStorage HTML5<br />
17:45 &#8211; 19:00 &#8211; jQuery &#8211; Essencial</p>
<p>Participe acessando <a target="_blank" href="http://conference.soudev.com.br/participar.php" target="_blank">este link</a> e ajude a divulgar pelo twitter com a hashtag <a target="_blank" href="https://twitter.com/#!/search/%23soudevcon" target="_blank"><strong>#soudevcon</strong></a>.<br />
Para mais informações, acesse o site do evento: <a target="_blank" href="http://conference.soudev.com.br" target="_blank"><strong>http://conference.soudev.com.br</strong></a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=SQtjKXU3nvc:VAnChN1xhjc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=SQtjKXU3nvc:VAnChN1xhjc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>No próximo sábado (15/10/11) acontecerá o evento #soudevcon, uma conferência online de desenvolvedores para desenvolvedores. Este será o primeito evento online e grátis da comunidade #soudev. Eu irei palestrar no evento falando sobre TDD. Dê uma conferida na descrição da minha palestra: Desenvolvedor no controle utilizando TDD Nessa palestra apresentarei o que é TDD (Test [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/10/10/soudevcon-em-151011-conferencia-online-de-para-desenvolvedores/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/10/10/soudevcon-em-151011-conferencia-online-de-para-desenvolvedores/</feedburner:origLink></item><item><title>Material palestra “Testando aplicações Flex com Selenium” do Flex Mania 2011</title><link>http://feedproxy.google.com/~r/victorvserta/~3/uL6xCBN5N6U/</link><category>Eventos</category><category>Flex</category><category>adobe flex</category><category>evento</category><category>flex</category><category>flexmania</category><category>palestra</category><category>selenium</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Mon, 11 Jul 2011 12:48:12 PDT</pubDate><guid isPermaLink="false">http://victorvserta.wordpress.com/?p=662</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Para quem assistiu (ou não&#8230; rsrsrs) minha palestra no <strong><a target="_blank" href="http://www.flexmania.com.br" target="_blank">Flex Mania 2011</a></strong>, disponibilizei os slides no <a target="_blank" href="http://www.slideshare.net/victorvserta/testando-aplicaes-flex-com-selenium" target="_blank">SlideShare</a> e o código-fonte no <a target="_blank" href="https://github.com/victorserta/Palestra_Selenium_Flex" target="_blank">GitHub</a>. A gravação da palestra também está disponível.</p>
<p><strong>Gravação da palestra:</strong><br />
<a target="_blank" href="http://experts.adobeconnect.com/p4jsu4pxctu/" target="_blank">http://experts.adobeconnect.com/p4jsu4pxctu/</a></p>
<p><strong>Slides da palestra:</strong></p>
<p style="text-align: center;"><object type='application/x-shockwave-flash' wmode='opaque' data='http://static.slideshare.net/swf/ssplayer2.swf?id=9713356&doc=flexselenium-111015103233-phpapp01' width='425' height='348'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=9713356&doc=flexselenium-111015103233-phpapp01' /><param name='allowFullScreen' value='true' /></object></p>
<p><strong>Código-fonte apresentado: </strong><br />
<a target="_blank" href="https://github.com/victorserta/Palestra_Selenium_Flex" target="_blank">https://github.com/victorserta/Palestra_Selenium_Flex</a></p>
<p><strong>Tópicos da palestra:</strong></p>
<ul>
<li>Por que testar?</li>
<li>Testes no <strong>desenvolvimento ágil</strong></li>
<li>O que é <strong>Selenium</strong>?</li>
<li>Ferramentas para utilizar <strong>Selenium</strong> com aplicações <strong>Flex</strong></li>
<li><a target="_blank" href="http://code.google.com/p/sfapi/" target="_blank">sfapi: Selenium Flex API</a></li>
<li><a target="_blank" href="http://code.google.com/p/flash-selenium/" target="_blank">Flash Selenium</a></li>
<li><a target="_blank" href="http://code.google.com/p/flex-ui-selenium/" target="_blank">FlexUISelenium</a></li>
<li><a target="_blank" href="http://www.gorillalogic.com/flexmonkium" target="_blank">FlexMonkium</a></li>
<li>Exemplo <strong>integração contínua</strong></li>
<li>Exemplo <strong>testes como documentação</strong></li>
</ul>
<p>Ficou alguma dúvida ou tem algum comentário/crítica? Então poste um comentário aqui ou envie um tweet pra mim (<a target="_blank" href="http://twitter.com/victorserta" target="_blank">@victorserta</a>).</p>
<p><em>PS.: Obrigado ao <a target="_blank" title="Guilherme Sjlender" href="https://twitter.com/guisjlender/status/89682486489124864" target="_blank">@guisjlender</a>, <a target="_blank" href="https://twitter.com/samuelfac/status/89682709273776128" target="_blank">@samuelfac</a>, <a target="_blank" href="https://twitter.com/igorcosta/status/89686454527201280" target="_blank">@igorcosta</a>, <a target="_blank" title="MarcPires" href="https://twitter.com/MarcPires/status/89698671549087745" target="_blank">@MarcPires</a> e <a target="_blank" title="Anderson Andreatta" href="https://twitter.com/MrAndreatta/status/89686083712983041" target="_blank">@MrAndreatta</a> pelo feedback no Twitter após a palestra. Agradeço também a <a target="_blank" href="http://www.riacycle.com" target="_blank">RIACycle</a> pela organização do evento e pela oportunidade de palestrar.</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=uL6xCBN5N6U:R_--W2U9GDw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=uL6xCBN5N6U:R_--W2U9GDw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Para quem assistiu (ou não&amp;#8230; rsrsrs) minha palestra no Flex Mania 2011, disponibilizei os slides no SlideShare e o código-fonte no GitHub. A gravação da palestra também está disponível. Gravação da palestra: http://experts.adobeconnect.com/p4jsu4pxctu/ Slides da palestra: Código-fonte apresentado:  https://github.com/victorserta/Palestra_Selenium_Flex Tópicos da palestra: Por que testar? Testes no desenvolvimento ágil O que é Selenium? Ferramentas para [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/07/11/material-palestra-testando-aplicacoes-flex-com-selenium-do-flex-mania-2011/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/07/11/material-palestra-testando-aplicacoes-flex-com-selenium-do-flex-mania-2011/</feedburner:origLink></item><item><title>Flex Mania 2011 é essa semana (7 a 10 de Julho)</title><link>http://feedproxy.google.com/~r/victorvserta/~3/gaiMHFKHFDM/</link><category>Eventos</category><category>Flex</category><category>adobe flex</category><category>agile</category><category>air</category><category>evento</category><category>flexmania</category><category>selenium</category><category>test</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Tue, 05 Jul 2011 11:38:36 PDT</pubDate><guid isPermaLink="false">http://victorvserta.wordpress.com/?p=644</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p style="text-align:center;"><a target="_blank" href="http://www.flexmania.com.br/"><img class="size-full wp-image-647 aligncenter" title="Logotipo Flex Mania 2011" src="http://victorserta.com.br/blog//wp-content/uploads/2011/07/flexmania2011.png" alt="Logotipo Flex Mania 2011" width="400" height="197" /></a></p>
<p style="text-align:left;">O <a target="_blank" href="http://www.flexmania.com.br/" target="_blank"><strong>Flex Mania 2011</strong></a> é essa semana! O evento online tem como principais temas as tecnologias <strong>Adobe Flex</strong> e <strong>AIR</strong>. Serão <a target="_blank" href="http://www.flexmania.com.br/agenda.php" target="_blank">mais de 30 palestras</a> em 4 dias de evento (7 a 10 de Julho).</p>
<p style="text-align:left;">A minha palestra no evento será no sábado de manhã às 9:15 e falarei sobre testes de aplicações desenvolvidas em <strong>Flex</strong> com a ferramenta <a target="_blank" href="http://seleniumhq.org/" target="_blank"><strong>Selenium</strong></a>. Vou demonstrar de forma prática como utilizar essa ferramenta com <strong>Flex</strong> e como aplicar os conceitos no contexto de <strong>desenvolvimento ágil</strong>.</p>
<p style="text-align:left;">Se você tem alguma dúvida ou sugestão em relação ao assunto, comente aqui que eu respondo durante a palestra. <img src='http://victorserta.com.br/blog//wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align:left;">Mais detalhes sobre o evento no site <a target="_blank" href="http://www.flexmania.com.br" target="_blank">http://www.flexmania.com.br</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=gaiMHFKHFDM:8IKSc4icC10:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=gaiMHFKHFDM:8IKSc4icC10:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>O Flex Mania 2011 é essa semana! O evento online tem como principais temas as tecnologias Adobe Flex e AIR. Serão mais de 30 palestras em 4 dias de evento (7 a 10 de Julho). A minha palestra no evento será no sábado de manhã às 9:15 e falarei sobre testes de aplicações desenvolvidas em [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/07/05/flex-mania-2011-e-essa-semana-7-a-10-de-julho/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/07/05/flex-mania-2011-e-essa-semana-7-a-10-de-julho/</feedburner:origLink></item><item><title>Injeção de Dependência em Java</title><link>http://feedproxy.google.com/~r/victorvserta/~3/l8N9pbmbrto/</link><category>Java</category><category>JBoss Seam</category><category>Spring</category><category>designpattern</category><category>designpatterns</category><category>EJB</category><category>ejb3</category><category>guice</category><category>jsr299</category><category>jsr330</category><category>picocontainer</category><category>seam</category><category>spring</category><category>weld</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Tue, 28 Jun 2011 22:42:15 PDT</pubDate><guid isPermaLink="false">http://victorvserta.wordpress.com/?p=503</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><strong>Injeção de dependência</strong> (<strong>Depedency Injection</strong> ou apenas <strong>DI</strong>) é um <strong>design pattern</strong> utilizado para manter o acoplamento fraco entre classes ou módulos do sistema. O foco principal é fazer com que uma classe não tenha conhecimento de como instanciar um objeto de um tipo do qual é dependente.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-593" title="Inject Coffee" src="http://victorserta.com.br/blog//wp-content/uploads/2011/06/injectcoffee.jpg" alt="Inject Coffee - Injeção Dependência em Java" width="350" height="350" /></p>
<p>Neste post vou apresentar as principais ferramentas utilizadas com essa finalidade em <strong>Java</strong>, mas antes uma explicação inicial sobre o assunto. Dê uma olhada no código <strong>Java</strong> abaixo:</p>
<p><span id="more-503"></span></p>
<pre>public class CaixaMercado {

 private CatalogoProdutos catalogoProdutos =&nbsp;new CatalogoProdutosBD();

 private List&lt;Produto&gt; itensCompraAtual;

 public void iniciarNovaCompra() {
  itensCompraAtual = new ArrayList&lt;Produto&gt;();
 }

 public void produtoPassadoNoLeitor(String codigoDeBarras)&nbsp;throws ProdutoInexistenteException {
  if (itensCompraAtual == null) {
   throw new IllegalStateException(&quot;Compra n&atilde;o foi iniciada.&quot;);
  }

  Produto produto = catalogoProdutos.buscarPeloCodigoBarras(codigoDeBarras);

  if (produto == null) {
   throw new ProdutoInexistenteException();
  }

  itensCompraAtual.add(produto);
 }

 public List&lt;Produto&gt; finalizarCompra() {
  // faz algo

  List&lt;Produto&gt; itensCompraAnterior = itensCompraAtual;
  itensCompraAtual = null;

  return itensCompraAnterior;
 }
}</pre>
<p>Neste exemplo quando um objeto da classe CaixaMercado é instanciado, também é instanciado um objeto do tipo CatalogoProdutosBD (veja na linha 3). Isso torna a classe CaixaMercado dependente da implementação do catálogo lido a partir do banco de dados. Você pode pensar: &#8220;Mas nunca vou utilizar outra fonte de dados mesmo.&#8221;. E com relação aos testes unitários?  E se a classe CatalogoProdutosBD precisasse receber algum parâmetro específico?</p>
<h3>Resolvendo &#8220;manualmente&#8221;</h3>
<p>A opção mais simples para resolver este problema é <strong>injetar</strong> o catálogo de produtos no construtor da classe CaixaMercado. Dessa forma, a classe CaixaMercado fica totalmente desacoplada da implementação de CatalogoProdutos, pois não tem conhecimento se o produto será consultado a partir da base de dados ou arquivo texto, por exemplo. Neste caso, também poderia ser utilizado um método setter para a <strong>injeção</strong>.</p>
<pre>public class CaixaMercado {

 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 public CaixaMercado(CatalogoProdutos catalogoProdutos) {
  this.catalogoProdutos = catalogoProdutos;
 }

//...
}</pre>
<p>Essa técnica pode ser aplicada para ligar diferentes componentes de sua aplicação com o objetivo diminuir o acoplamento entre eles. Para facilitar a utilização de <strong>DI</strong>, existem vários <strong>frameworks</strong> que auxiliam na injeção de objetos através de metadados, como XML e annotations. A seguir apresento as principais opções utilizadas na tecnologia <strong>Java</strong>.</p>
<h3>Spring</h3>
<p>O <strong>Spring</strong> é um framework de <strong>IoC</strong> (<strong>Inversão de Controle</strong>)  que utiliza a técnica de Injeção de Dependência. Para o código de exemplo, a configuração através de XML seria:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
&lt;beans&gt;
 &lt;bean id="CatalogoProdutos" class="org.exemplo.di.CatalogoProdutosBD" /&gt;
 &lt;bean id="CaixaMercado" class="org.exemplo.di.spring.CaixaMercado"&gt;
  &lt;property name="catalogoProdutos" ref="CatalogoProdutos" /&gt;
 &lt;/bean&gt;
&lt;/beans&gt;</pre>
<p>Nas últimas versões do <strong>Spring</strong> é possível utilizar apenas annotations no lugar do XML para realizar essa configuração, conforme mostra o código abaixo:</p>
<pre>public class CaixaMercado {

 @Autowired
 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 //...
}</pre>
<p>&nbsp;</p>
<pre>@Component
public class CatalogoProdutosBD implements CatalogoProdutos {

 @Override
 public Produto buscarPeloCodigoBarras(String codigo) {
  //...
 }
}</pre>
<p>O escopo das instâncias gerenciadas pelo <strong>Spring</strong> podem ser definidos por XML com o atributo <em>scope</em> ou através da annotation <em>@Scope</em>. Os valores possíveis são:</p>
<ul>
<li><em>singleton</em>: Instância única por IoC container</li>
<li><em>prototype</em>: Nova instância em cada requisição</li>
<li><em>request</em>: Nova instância por requisição HTTP</li>
<li><em>session</em>: Nova instância por sessão HTTP</li>
<li><em>globalSession</em>: Nova instância por sessão HTTP global (utilizado com portlets)</li>
</ul>
<p>O Spring também define as seguintes especializações da annonation <em>@Component</em> para identificar diferentes tipos de objetos:</p>
<ul>
<li><em>@Controller</em></li>
<li><em>@Service</em></li>
<li><em>@Repository</em></li>
</ul>
<p>Como todo desenvolvedor Java deve saber, o <strong>Spring</strong> é muito mais do que isso. O objetivo aqui foi apresentar apenas como trabalhar com injeção de dependência com este framework.</p>
<h3>Guice</h3>
<p>Outra opção é o <strong>Guice</strong> (pronuncia-se &#8220;juice&#8221;), que é um framework de <strong>injeção de dependências</strong> desenvolvido pelo Google. De acordo com o site do projeto, o próprio Google o utiliza em aplicações de missão crítica desde 2006. Abaixo o mesmo exemplo utilizando o <strong>Guice</strong>:</p>
<pre>public class CaixaMercado {

 @Inject
 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 //...
}</pre>
<p>Não é necessária nenhuma mudança na classe CatalogoProdutosBD em relação a implementação original. Entretanto, é necessário criar uma classe que define quais são as implementações a serem injetadas:</p>
<pre>public class CaixaMercadoModule extends AbstractModule {

 @Override
 protected void configure() {
  bind(CatalogoProdutos.class).to(CatalogoProdutosBD.class);
 }

}</pre>
<p>O <strong>Guice</strong> pode ser utilizado em projetos web tornando possível definir o escopo das instâncias dos tipos que são injetados. Para isso são disponibilizadas as seguintes annotations:</p>
<ul>
<li><em>@Singleton</em></li>
<li><em>@SessionScoped</em></li>
<li><em>@RequestScoped</em></li>
</ul>
<h3>Seam</h3>
<p>O <strong>JBoss Seam</strong>  surgiu com o objetivo inicial de realizar uma melhor integração entre o JSF e EJB 3, porém atualmente é um framework muito completo e pode ser utilizado sem EJB ou até mesmo com o Apache Wicket no lugar do JSF, por exemplo. Até a versão 2.x utilizaríamos da seguinte maneira:</p>
<pre>public class CaixaMercado {

 @In
 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 //...
}</pre>
<p>&nbsp;</p>
<pre>@Name("catalogoProdutos")
public class CatalogoProdutosBD implements CatalogoProdutos {

 @Override
 public Produto buscarPeloCodigoBarras(String codigo) {
  //...
 }
}</pre>
<p>A partir do <strong>Seam</strong> foram propostas e aprovadas a <a target="_blank" href="http://www.jcp.org/en/jsr/detail?id=330" target="_blank">JSR 330: Dependency Injection for Java</a> e a <a target="_blank" href="http://www.jcp.org/en/jsr/detail?id=299" target="_blank">JSR 299: Contexts and Dependency Injection for the Java EE platform</a>. A implementação de referência da JSR 299 é o projeto Weld, que foi baseado no core do <strong>Seam</strong>. A versão 3 do <strong>Seam</strong> utiliza o <strong>Weld</strong> e adiciona funcionalidades especificas que não estão padronizadas.</p>
<h3>JSR 330: Dependency Injection for Java</h3>
<p>A <strong>JSR 330</strong> padroniza as annotations para a injeção de dependências na linguagem Java. As últimas versões do <strong>Spring</strong>, <strong>Guice</strong> e <strong>Seam</strong> são compatíveis com este padrão. Veja abaixo como fica o exemplo:</p>
<pre>public class CaixaMercado {
 @Inject
 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 //...
}</pre>
<p>&nbsp;</p>
<pre>@Named("catalogoProdutos")
public class CatalogoProdutosBD implements CatalogoProdutos {

 @Override
 public Produto buscarPeloCodigoBarras(String codigo) {
  //...
 }
}</pre>
<p>As annotations criadas para injeção de dependências através da <strong>JSR 299</strong> estão todas no pacote <a target="_blank" href="http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/package-summary.html" target="_blank">javax.inject.*</a>. Essas annotations são:</p>
<ul>
<li><em>@Inject</em>: Injeta um objeto em atributo, construtor ou método</li>
<li><em>@Named</em>: Qualificador de tipo a ser injetado através de uma string</li>
<li><em>@Singleton</em>: Instância única do tipo a ser injetado</li>
<li><em>@Qualifier</em>: Identifica annotation que qualifica tipo a ser injetado</li>
<li><em>@Scope</em>: Identifica annotation que define um tipo de escopo</li>
</ul>
<p>Na prática as 2 últimas annotations (<em>@Qualifier</em> e <em>@Scope</em>) são utilizadas pelas implementações (<strong>Seam</strong>, <strong>Guice</strong>, etc.) ou quando se deseja realizar alguma customização específica.</p>
<h3>JSR 299: CDI for the Java EE platform</h3>
<p>Essa JSR descreve várias outras funcionalidades além da injeção de dependências. Para este post vou somente apresentar as annotations que definem os possíveis escopos dos objetos criados para serem injetados, que complementam as especificados pela <strong>JSR 330</strong>:</p>
<ul>
<li><em>@ApplicationScoped</em></li>
<li><em>@SessionScoped</em></li>
<li><em>@RequestScoped</em></li>
<li><em>@ConversationScoped</em></li>
</ul>
<h3>EJB 3</h3>
<p>Quem utiliza <strong>EJB 3</strong> também tem disponível annotations para injeção de dependências. Essas annotations são:</p>
<ul>
<li><em>@EJB:</em> Injeta um session bean</li>
<li><em>@PersistenceContext:</em> Injeta o EntityManager gerenciado</li>
<li><em>@PersistenceUnit:</em> Injeta o EntityManagerFactory</li>
<li><em>@Resource:</em> Injeta recurso disponível na árvore JNDI (Data Source, JMS, etc.)</li>
<li><em>@WebServiceRef:</em> Injeta referência para um webservice</li>
</ul>
<p>Utilizando essas annotations, o container irá realizar o lookup dos objetos e injetá-los. Se fossemos utilizar <strong>EJB</strong> para o exemplo, poderíamos considerar a implementação de CaixaMercado como um Session Bean Stateful e a implementação do CatalogoProduto como Stateless. Abaixo o código:</p>
<pre>@Local
public interface CaixaMercado {
 public void iniciarNovaCompra();
 public void produtoPassadoNoLeitor(String codigoDeBarras);
 public List&lt;Produto&gt; finalizarCompra();
}</pre>
<p>&nbsp;</p>
<pre>@Stateful
public class CaixaMercadoBean implements CaixaMercado {

 @EJB
 private CatalogoProdutos catalogoProdutos;

 private List&lt;Produto&gt; itensCompraAtual;

 //...
}</pre>
<p>&nbsp;</p>
<pre>@Local
public class CatalogoProdutos
 public Produto buscarPeloCodigoBarras(String codigo);
}</pre>
<p>&nbsp;</p>
<pre>@Stateless
public class CatalogoProdutosBD implements CatalogoProdutos {

@Override
public Produto buscarPeloCodigoBarras(String codigo) {
//...
}
}</pre>
<p>Lembrando que também é possível utilizar implementações da <strong>JSR 299</strong> em conjunto com o <strong>EJB 3</strong>.</p>
<h3>Outras opções</h3>
<p>Abaixo outras opções de ferramentas que podem ser utilizadas para auxiliar a injeção de dependência:</p>
<ul>
<li><a target="_blank" href="http://picocontainer.codehaus.org/" target="_blank">PicoContainer</a></li>
<li><a target="_blank" href="http://attic.apache.org/" target="_blank">Apache Attic</a></li>
<li><del><a target="_blank" href="http://hivemind.apache.org/" target="_blank">Apache HiveMind</a></del> (descontinuado)</li>
</ul>
<p>Se você souber de mais alguma me avisa que eu adiciono aqui <img src='http://victorserta.com.br/blog//wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Conclusão</h3>
<p>Nesse post descrevi o que é, por que e como utilizar o conceito <strong>Injeção de Dependência em Java</strong>. Cada ferramenta apresentada aqui possui muito mais funcionalidades para injeção de objetos e não se limitam a somente essa função. Escolha a(s) sua(s) e bons estudos!</p>
<h3>Referências</h3>
<ul>
<li><a target="_blank" href="http://martinfowler.com/articles/injection.html" target="_blank">Inversion of Control Containers and the Dependency Injection pattern &#8211; Martin Fowler</a></li>
<li><a target="_blank" href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html" target="_blank">Spring Framework Reference: The IoC container</a></li>
<li><a target="_blank" href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/" target="_blank">Javadoc Spring 3.0.x</a></li>
<li><a target="_blank" href="http://matthiaswessendorf.wordpress.com/2010/04/17/spring-3-0-and-jsr-330-part/" target="_blank">Spring 3.0 and JSR 330: Using @Named</a></li>
<li><a target="_blank" href="http://code.google.com/docreader/#p=google-guice&amp;s=google-guice&amp;t=GettingStarted" target="_blank">Google Guice User&#8217;s Guide: Getting Started</a></li>
<li><a target="_blank" href="http://google-guice.googlecode.com/svn/trunk/javadoc/packages.html" target="_blank">Javadoc Google Guice</a></li>
<li><a target="_blank" href="http://docs.jboss.org/seam/3/latest/reference/en-US/html/" target="_blank">Seam 3 Reference Guide</a></li>
<li><a target="_blank" href="http://www.jcp.org/en/jsr/detail?id=330" target="_blank">JSR 330 &#8211; Java Community Process</a></li>
<li><a target="_blank" href="http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/package-summary.html" target="_blank">Javadoc JSR 330</a></li>
<li><a target="_blank" href="http://www.jcp.org/en/jsr/detail?id=299" target="_blank">JSR 299 &#8211; Java Community Process</a></li>
<li><a target="_blank" href="http://docs.jboss.org/cdi/api/1.0/" target="_blank">Javadoc JSR 299</a></li>
<li><a target="_blank" href="http://refcardz.dzone.com/refcardz/dependency-injection-in-ejb3" target="_blank">Dependency Injection in EJB 3</a></li>
<li><a target="_blank" href="http://victorvserta.wordpress.com/2008/11/02/exemplo-de-cadastro-com-o-jboss-seam/" target="_blank">Exemplo de cadastro com o JBoss Seam</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=l8N9pbmbrto:3vT4WI4AIIA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=l8N9pbmbrto:3vT4WI4AIIA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Injeção de dependência (Depedency Injection ou apenas DI) é um design pattern utilizado para manter o acoplamento fraco entre classes ou módulos do sistema. O foco principal é fazer com que uma classe não tenha conhecimento de como instanciar um objeto de um tipo do qual é dependente. Neste post vou apresentar as principais ferramentas utilizadas com [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/06/29/injecao-de-dependencia-em-java/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">7</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/06/29/injecao-de-dependencia-em-java/</feedburner:origLink></item><item><title>Evento ITCare-PR em Curitiba 14/05/11</title><link>http://feedproxy.google.com/~r/victorvserta/~3/XUzh8qXdZLA/</link><category>Android</category><category>iOS</category><category>Java</category><category>Scrum</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Victor Serta</dc:creator><pubDate>Thu, 05 May 2011 16:53:03 PDT</pubDate><guid isPermaLink="false">http://victorvserta.wordpress.com/?p=550</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a href="http://victorserta.com.br/blog//wp-content/uploads/2011/05/banner_itcarepr.jpg"><img class="size-full wp-image-551 aligncenter" title="Banner IT Care Paraná" src="http://victorserta.com.br/blog//wp-content/uploads/2011/05/banner_itcarepr.jpg" alt="Banner IT Care Paraná" width="448" height="239" /></a></p>
<p>Quer assistir <strong>palestras</strong> interessantes e ao mesmo tempo ajudar as vítimas das fortes chuvas que atingiram o Paraná? Este é o objetivo do evento <strong>IT Care-PR</strong> que contará com a presença de <a target="_blank" href="http://www.java.net/blogs/brinkley" target="_blank">Roger Brinkley</a> da Oracle.</p>
<p>Eu participarei do evento com a palestra <strong>TDD com Java</strong>, onde vou explicar os fundamentos da metodologia <strong>Test Driven Development</strong> com exemplos na linguagem <strong>Java</strong>.</p>
<p>Além de <strong>Java</strong>, o evento também terá palestras sobre <strong>.NET</strong>, <strong>Android</strong>, <strong>iOS</strong> (iPhone) e <strong>Scrum</strong>.</p>
<p><strong>Quando:</strong> 14/05/2011<br />
<strong>Onde:</strong> Universidade Positivo - Auditório 2 da Escola de Negócios (Bloco Amarelo)<br />
<strong>Palestras:</strong> <a target="_blank" href="http://itcarepr.blogspot.com/2011/04/palestrantes.html" target="_blank">Clique aqui</a><br />
<strong>Palestrantes:</strong> <a target="_blank" href="http://itcarepr.blogspot.com/2011/04/palestrantes_16.html" target="_blank">Clique aqui</a><br />
<strong>Inscrição:</strong> <a target="_blank" href="http://itcarepr.blogspot.com/2011/04/inscricoes.html" target="_blank">Clique aqui</a><br />
<strong>Entrada:</strong> Alimentos não-perecíveis, material de limpeza e água mineral</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/victorvserta?a=XUzh8qXdZLA:HpjRKUkwh9Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/victorvserta?a=XUzh8qXdZLA:HpjRKUkwh9Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/victorvserta?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded><description>Quer assistir palestras interessantes e ao mesmo tempo ajudar as vítimas das fortes chuvas que atingiram o Paraná? Este é o objetivo do evento IT Care-PR que contará com a presença de Roger Brinkley da Oracle. Eu participarei do evento com a palestra TDD com Java, onde vou explicar os fundamentos da metodologia Test Driven Development [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://victorserta.com.br/blog/2011/05/05/evento-itcare-pr-em-curitiba-140511/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://victorserta.com.br/blog/2011/05/05/evento-itcare-pr-em-curitiba-140511/</feedburner:origLink></item></channel></rss>

