<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rafael Liu Blog &#187; teste</title>
	<atom:link href="http://rafaelliu.net/category/teste/feed/" rel="self" type="application/rss+xml" />
	<link>http://rafaelliu.net</link>
	<description>Café, pinguins e outras coisas</description>
	<lastBuildDate>Wed, 28 Mar 2012 21:54:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Devoxx 2011</title>
		<link>http://rafaelliu.net/2011/11/23/devoxx-2011/</link>
		<comments>http://rafaelliu.net/2011/11/23/devoxx-2011/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 14:58:22 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[Evento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[arquillian]]></category>
		<category><![CDATA[cdi]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[weld]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=576</guid>
		<description><![CDATA[EDIT: saiu o artigo na InfoQ BR De volta do Devoxx! O evento foi muito bom. De longe o maior, mais alto nível, melhor organizado evento que já fui. Minha palestra aconteceu na quarta e qual foi minha surpresa ao ver o Pete Muir (Seam/Weld/Arquillian), Dan Allen (Seam/Weld/Arquillian) e Aslak Knutsen (Arquillian lead) sentados na [...]]]></description>
			<content:encoded><![CDATA[<p><strong>EDIT:</strong> saiu o <a title="Devoxx 2011: foco em comunidade, Android e HTML5" href="http://www.infoq.com/br/news/2011/11/devoxx2011" target="_blank">artigo</a> na InfoQ BR</p>
<p>De volta do Devoxx! O evento foi muito bom. De longe o maior, mais alto nível, melhor organizado evento que já fui.</p>
<p>Minha palestra aconteceu na quarta e qual foi minha surpresa ao ver o <a title="Twitter" href="twitter.com/#!/plmuir" target="_blank">Pete Muir</a> (Seam/Weld/Arquillian), <a title="Twitter" href="http://twitter.com/#!/mojavelinux" target="_blank">Dan Allen</a> (Seam/Weld/Arquillian) e <a title="Twitter" href="http://twitter.com/#!/aslakknutsen" target="_blank">Aslak Knutsen</a> (Arquillian lead) sentados na primeira fileira!</p>
<p>O mais legal foi ter conversado com eles e eles terem me mostrado que a proposta que apresentei já está no road map do Arquillian. Legal!</p>
<p>O evento foi uma ótima oportunidade para fazer networking. Além do convite para um brainstorm regado a cerveja belga do time do Arquillian, encontrei os brazucas <a title="Twitter" href="http://twitter.com/#!/yarasenger" target="_blank">Yara</a> e o <a title="Twitter" href="http://twitter.com/#!/vsenger" target="_blank">Vinícus</a> Senger lá também.</p>
<p>Outra pessoa com quem estava querendo trocar umas idéias é o <a title="Twitter" href="http://twitter.com/#!/trevorreznik" target="_blank">Mathieu Ancelin</a>, criador do weld-osgi, idéia que eu há muito queria implementar e ele fez eximiamente.</p>
<p>Deve estar saindo nos proximos dias um artigo que escrevi para a InfoQ BR sobre a cobertura do Devoxx. Quando sair post o link aqui. Também disponibilizei os <a title="Slideshare" href="http://www.slideshare.net/rafaelliu/make-it-testdriven-with-cdi" target="_blank">slides da palestra</a> no Slideshare.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2011/11/23/devoxx-2011/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica: melhorando o tempo de execução do Selenium</title>
		<link>http://rafaelliu.net/2011/11/03/dica-melhorando-o-tempo-de-execucao-do-selenium/</link>
		<comments>http://rafaelliu.net/2011/11/03/dica-melhorando-o-tempo-de-execucao-do-selenium/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 22:02:19 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=549</guid>
		<description><![CDATA[Aqui vai uma dica rápida de como agilizar a execução dos seus testes: FirefoxProfile profile = new FirefoxProfile&#40;&#41;; // here's the important part profile.setPreference&#40;&#34;permissions.default.image&#34;, 2&#41;; &#160; WebDriver driver = new FirefoxDriver&#40;profile&#41;; selenium = new WebDriverBackedSelenium&#40;driver, &#34;http://rafaelliu.net&#34;&#41;; Com isso o Firefox não irá requisitar, baixar e renderizar imagens. A diferença varia de acordo a quantidade de [...]]]></description>
			<content:encoded><![CDATA[<p>Aqui vai uma dica rápida de como agilizar a execução dos seus testes:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">FirefoxProfile profile <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FirefoxProfile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// here's the important part</span>
profile.<span style="color: #006633;">setPreference</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;permissions.default.image&quot;</span>, <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
WebDriver driver <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FirefoxDriver<span style="color: #009900;">&#40;</span>profile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
selenium <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WebDriverBackedSelenium<span style="color: #009900;">&#40;</span>driver, <span style="color: #0000ff;">&quot;http://rafaelliu.net&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Com isso o Firefox não irá requisitar, baixar e renderizar imagens. A diferença varia de acordo a quantidade de imagens na página e hits no cache. Executei um teste no <a href="http://g1.globo.com/" target="_blank">http://g1.globo.com/</a> com 10 iterações, o que resultou nos seguintes tempos (em milissegundos):</p>
<pre class="text">NormalSeleniumTest - 39021ms
TweakedSeleniumTest - 29072ms</pre>
<p>Hope that helps!</p>
<p>&nbsp;</p>
<p>Referência: <a href="http://kb.mozillazine.org/Permissions.default.image" target="_blank">http://kb.mozillazine.org/Permissions.default.image</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2011/11/03/dica-melhorando-o-tempo-de-execucao-do-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementando testes com mock objects</title>
		<link>http://rafaelliu.net/2009/07/20/implementando-testes-com-mock-objects/</link>
		<comments>http://rafaelliu.net/2009/07/20/implementando-testes-com-mock-objects/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 20:14:08 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[jMock]]></category>
		<category><![CDATA[jUnit]]></category>
		<category><![CDATA[Mock Objects]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=173</guid>
		<description><![CDATA[Ok, estou convencido que usar mock objects é uma boa idéia mas como faço isso? A princípio não é qualquer código que está pronto para ser testado usando-se mocks, ele precisa ser escrito de uma forma a possibilitar isso. No geral escrever código de tal forma que seja testável é uma boa prática e indica [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, estou convencido que usar mock objects é uma boa idéia mas como faço isso? A princípio não é qualquer código que está pronto para ser testado usando-se mocks, ele precisa ser escrito de uma forma a possibilitar isso.</p>
<p>No geral escrever código de tal forma que seja testável é uma boa prática e indica que ele segue alguns princípios de projeto que o tornam fracamente acoplado, aumentam sua manutenibilidades, etc.</p>
<p>Vejamos um exemplo de código que deva ser alterado para se tornar testável:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		customerDao <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerDaoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como já devo ter dito, não sou muito bom de exemplos.. Mas acho que esse ai está bem ilustrativo, embora para alguns DAO possa parecer meio arcaico. Deixei as reticências para a imaginação de vocês.</p>
<p>Existem 3 formas de se alterar esse código, as duas primeiras se usam de técnicas de bom projeto e melhoram a qualidade do software:</p>
<p><strong>1. Dependency Injection (DI)</strong></p>
<p>O mais simples e limpo. Foi a forma usada para injetar os mocks no exemplo do post passado:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setCustomerDAO<span style="color: #009900;">&#40;</span>CustomerDao customerDao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">customerDao</span> <span style="color: #339933;">=</span> customerDao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Basta agora, na hora de testar injetar não o componente real, mas seu mock.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Test
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// set up mock</span>
    	<span style="color: #000000; font-weight: bold;">final</span> CustomerDao customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// test state</span>
    	CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	customerFacade.<span style="color: #006633;">setCustomerDAO</span><span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// expectations</span>
        context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
	        oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// execute</span>
        customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// verify</span>
        context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>2. Factory Method</strong></p>
<p>Uma técnica um pouco mais embolada mas que ainda assim trás melhorias para o código consiste na extração de um Factory Method:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacade <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDao customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		customerDao <span style="color: #339933;">=</span> createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> CustomerDao createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerDaoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> hireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fireCustomer<span style="color: #009900;">&#40;</span>Custumer custumer<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Notem que o createCustomerDao() é protected, isso porque na hora de usá-lo nos testes vamos estender essa classe e sobrescrever o createCustomerDao() para retornar um mock:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Test
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// set up mock</span>
    	<span style="color: #000000; font-weight: bold;">final</span> CustomerDao customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// test state</span>
    	CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		@Override
		<span style="color: #000000; font-weight: bold;">protected</span> CustomerDao createCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// return the mock instead!!</span>
			<span style="color: #000000; font-weight: bold;">return</span> customerDao<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
    	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// expectations</span>
        context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
	        oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// execute</span>
        customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// verify</span>
        context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>3. Aspect Oriented Programming</strong></p>
<p>Essa é uma técnica <em>workaround</em>, e é para quando realmente não há jeito de usar-se as outras técnicas. Com ela não é preciso alterar código algum, apenas criar um<em> point cut </em>que intercepte a instanciação do CustomerDaoImpl. O <em>test case</em> é o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomerFacadeTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> CustomerDaoImpl customerDao<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CustomerFacadeTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// so we can mock a concrete class</span>
		context.<span style="color: #006633;">setImposteriser</span><span style="color: #009900;">&#40;</span>ClassImposteriser.<span style="color: #006633;">INSTANCE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		customerDao <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>CustomerDaoImpl.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// returns the mock instance in test context</span>
	<span style="color: #000000; font-weight: bold;">public</span> CustomerDaoImpl getCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> customerDao<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testHire<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// test state</span>
		CustomerFacade customerFacade <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerFacade<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// expectations</span>
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
			oneOf<span style="color: #009900;">&#40;</span>customerDao<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">save</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// execute</span>
		customerFacade.<span style="color: #006633;">hireCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Custumer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verify</span>
		context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> print<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;adasda&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E criando-se o aspecto em AspectJ:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> aspect InstanciatingAspect<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// intercept only from CustomerFacadeTest</span>
	pointcut testing<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
		<span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
		execution<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> CustomerFacadeTest.<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// intercept CustomerDaoImpl instantiations</span>
	pointcut instanciateCustomerDao<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>
		cflow<span style="color: #009900;">&#40;</span>testing<span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
		call<span style="color: #009900;">&#40;</span>CustomerDaoImpl.<span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span>..<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399;">Object</span> around<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> test<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> instanciateCustomerDao<span style="color: #009900;">&#40;</span>test<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// get a hold of the mock instance made public by our test case</span>
		CustomerDaoImpl customerDaoImpl <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>CustomerFacadeTest<span style="color: #009900;">&#41;</span> test<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCustomerDao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// return the mock reference instead</span>
		<span style="color: #000000; font-weight: bold;">return</span> customerDaoImpl<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como visto, a única dificuldade é que o aspecto deve retornar uma instância do mock que tenha sido criada no contexto do test case.Para tanto instanciamos o mock no test case e o tornamos acessível através do getCustomerDao(). Feito isso, ao interceptarmos no aspecto a criação do CustomerDaoImpl() nós a substituímos pela referência obtida do test case.</p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2009/07/20/implementando-testes-com-mock-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Série de trabalhos: Mock Objects</title>
		<link>http://rafaelliu.net/2009/05/02/serie-de-trabalhos-mock-objects/</link>
		<comments>http://rafaelliu.net/2009/05/02/serie-de-trabalhos-mock-objects/#comments</comments>
		<pubDate>Sun, 03 May 2009 01:18:03 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[jMock]]></category>
		<category><![CDATA[Mock Objects]]></category>
		<category><![CDATA[NDD]]></category>
		<category><![CDATA[TestNG]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=150</guid>
		<description><![CDATA[Estou fazendo dois trabalhos atualmente: sobre Mock Objects (como preparatório para Service Simulation, se tudo der certo) e sobre WSS. Por isso, e também para receber alguns inputs (que seriam muito bem vindos) vou postar algumas coisas da minha pesquisa aqui no blog. E nesse post explico o que são Mock Objects. Mock Objects são [...]]]></description>
			<content:encoded><![CDATA[<p>Estou fazendo dois trabalhos atualmente: sobre Mock Objects (como preparatório para Service Simulation, se tudo der certo) e sobre <a title="TLAs" href="http://rafaelliu.net/?page_id=64" target="_blank">WSS</a>. Por isso, e também para receber alguns <em>inputs</em> (que seriam muito bem vindos) vou postar algumas coisas da minha pesquisa aqui no blog. E nesse post explico o que são Mock Objects.</p>
<p>Mock Objects são objetos que simulam outros objetos. São principalmente usados em testes de unidade. Existem vários frameworks de Mock Objects mas pessoalmente prefiro o <a title="jMock" href="http://www.jmock.org/" target="_blank">jMock</a>. Abaixo mostro um exemplo de um teste de unidade usando-se <a title="TestNG" href="http://testng.org/doc/index.html" target="_blank">TestNG</a> 5.9 e jMock 2.5:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PublisherTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Mockery context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> PublisherTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		context <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// para podermos mockar uma classe</span>
		context.<span style="color: #006633;">setImposteriser</span><span style="color: #009900;">&#40;</span>ClassImposteriser.<span style="color: #006633;">INSTANCE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testOneSubscriberReceivesAMessage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// configura mock</span>
		Subscriber subscriber <span style="color: #339933;">=</span> context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>Subscriber.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Expectations expect <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// configura estado do objeto</span>
		Publisher publisher <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Publisher<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		publisher.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>subscriber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// expectativas</span>
		expect.<span style="color: #006633;">never</span><span style="color: #009900;">&#40;</span>subscriber<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span>expect<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// executa</span>
		publisher.<span style="color: #006633;">publish</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verifica</span>
		context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Usamos mocks em cenários onde precisamos testar um objeto que depende de outros. Qual o problema de dependências? O objetivo dos testes de unidade é testar objetos em isolado, mas se usássemos um Subscriber real erros nele poderiam fazer falhar o teste do Publisher (ver figura abaixo). Por isso usamos mocks.</p>
<table style="border-collapse: collapse; margin-left: auto; margin-right: auto; text-align: center;" border="0">
<tbody>
<tr>
<td>
<p><div id="attachment_166" class="wp-caption aligncenter" style="width: 226px"><img class="size-medium wp-image-166" title="functional-test" src="http://rafaelliu.net/wp-content/uploads/2009/05/functional-test-300x164.png" alt="Teste usando-se objetos reais" width="216" height="118" /><p class="wp-caption-text">Teste usando-se objetos reais</p></div></td>
<td>
<p><div id="attachment_167" class="wp-caption aligncenter" style="width: 226px"><img class="size-medium wp-image-167" title="unit-test" src="http://rafaelliu.net/wp-content/uploads/2009/05/unit-test-300x164.png" alt="Teste usando-se mocks" width="216" height="118" /><p class="wp-caption-text">Teste usando-se mocks</p></div></td>
</tr>
</tbody>
</table>
<p>Com mocks podemos não só substituir algum objeto, mas também controlar todas as interações que são feitas com ele: verificar chamadas de métodos, valores de parâmetros, definir valores de retorno, etc. No código acima estamos por exemplo esperando uma chamada ao método <em>receive</em> do <em>subscriber</em>.</p>
<p>Dito o objetivo que motivou a criação dessa técnica, existem outros que vieram a ser supridos por mocks:</p>
<ul>
<li>Abstrair camadas mais baixas do sistema, tanto por elas não estarem prontas quanto por querermos trabalhar <em>offline</em>.</li>
<li>Centralizar a configuração de estado no próprio mock ao invés de espalhá-las pelos testes de unidade.</li>
<li>Simular condições difíceis de reproduzir, como o lançamento de uma excessão mais esdrúxula ou um valor retorno raro.</li>
<li>Verificar mais rapidamente quando um erro ocorre (<em>fail fast</em>), indicando em que passo do comportamento esperado foi errado ao invés de apenas dizer que o estado final do objeto não condiz com o esperado.</li>
</ul>
<p>Algo muito interessante vindo do uso de mocks é o Need-Driven Development (NDD), mas não pretendo falar dele aqui. Quando sair meu trabalho disponibilizo no blog, mas quem tiver curiosidade pode me escrever, é sempre bom trocar idéias <img src='http://rafaelliu.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2009/05/02/serie-de-trabalhos-mock-objects/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

