<?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; NDD</title>
	<atom:link href="http://rafaelliu.net/tag/ndd/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>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>

