<?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>Flexible Diamond &#187; Development</title>
	<atom:link href="http://blog.flexiblediamond.com/category/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flexiblediamond.com</link>
	<description></description>
	<lastBuildDate>Wed, 02 Sep 2009 12:31:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>What&#8217;s the point of all this mockery?</title>
		<link>http://blog.flexiblediamond.com/2009/08/whats-the-point-of-all-this-mockery/</link>
		<comments>http://blog.flexiblediamond.com/2009/08/whats-the-point-of-all-this-mockery/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 21:53:28 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=176</guid>
		<description><![CDATA[I&#8217;ve jumped in with both feet, without pausing to explain why I&#8217;m doing it &#8211; so, where do mock objects fit into my daily testing behaviours?

when the system under test relies on an expensive resource
when the system under test relies on a live resource
when the system under test relies on a resource that doesn&#8217;t yet [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve jumped in with both feet, without pausing to explain why I&#8217;m doing it &#8211; so, where do mock objects fit into my daily testing behaviours?</p>
<ul>
<li>when the system under test relies on an expensive resource</li>
<li>when the system under test relies on a live resource</li>
<li>when the system under test relies on a resource that doesn&#8217;t yet exist</li>
<li>when I want to ensure that the system under test uses the resource correctly</li>
</ul>
<p>I had to build a couple of client applications recently (twitter and flickr, since you ask &#8211; talk about re-inventing the wheel &#8230;), which interacted with what I consider expensive resources &#8211; firstly, I was contacting the remote flickr servers and awaiting their response each time I tested; secondly, the twitter API <a href="http://apiwiki.twitter.com/Rate-limiting">puts limits on how often it&#8217;s called</a>, which means that I could run out of calls pretty quickly if every test made at least one call, and all tests were run each time I compiled the movie.</p>
<p>A couple of years ago, we built a googlemaps-stylee flash app for a certain weekend-break company to allow users to choose chalets (/lodges/huts/accommodation units &#8211; bizarrely &#8216;accommodation units&#8217; was the official term) online. The units&#8217; availability was updated in real time, so the app had to query the server for the latest data. The only problem with this was that the server application was still under design &#8211; it didn&#8217;t yet exist.</p>
<p>I&#8217;ve also worked with database developers who haven&#8217;t yet finalised their DB structure, and who keep dropping and re-building the database, which means deleting all the data that my test scripts rely on.</p>
<p>You only need to experience difficulties such as these a couple of times to realise that it&#8217;s imperative to have control of the remote/live/non-existent/under-development resource in order for the tests to be of any use.</p>
<p>The good news is that &#8211; in most cases &#8211; it&#8217;s possible to define an API for communication with the resource even before it exists, and that&#8217;s what makes mock objects so useful &#8211; they can honour the API, thus enabling the code we build against the tests to work against the resource when it&#8217;s ready.</p>
<p>Strikes me an example might be useful. Twitter suit you?</p>
<p>I have a TwitterView object, which takes a TwitterProxy which in turn communicates with the Twitter servers. I know it&#8217;s terrible &#8211; aren&#8217;t these chaps supposed to be cleanly separated? The TwitterView receives an event when the proxy has done all its loading, and then can populate the relevant TextFields. Easy, innit.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterView <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> title:<span class="kw3">TextField</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> tweets:<span class="kw3">TextField</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> proxy:ITwitterProxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterView<span class="br0">&#40;</span>proxy:ITwitterProxy = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">proxy</span> = proxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; initView<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTitle<span class="br0">&#40;</span><span class="st0">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> getTitle<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> title.<span class="kw3">text</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> setTitle<span class="br0">&#40;</span>title:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">title</span>.<span class="kw3">text</span> = title;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> setTweets<span class="br0">&#40;</span>tweets:<span class="kw3">Array</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">tweets</span>.<span class="kw3">htmlText</span> = tweets.<span class="kw3">join</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; override <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;[TwitterView]&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>proxy == <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy = <span class="kw2">new</span> TwitterProxy<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TwitterLoadEvent.<span class="me1">TWITTER_LOADED</span>, onTwitterLoaded<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy.<span class="me1">init</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> initView<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title = <span class="kw2">new</span> <span class="kw3">TextField</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title.<span class="kw3">autoSize</span> = TextFieldAutoSize.<span class="kw3">LEFT</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>title<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tweets = <span class="kw2">new</span> <span class="kw3">TextField</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tweets.<span class="kw3">width</span> = <span class="nu0">500</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tweets.<span class="kw3">autoSize</span> = TextFieldAutoSize.<span class="kw3">LEFT</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tweets.<span class="kw3">wordWrap</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tweets.<span class="me1">y</span> = title.<span class="me1">y</span> + title.<span class="kw3">height</span> + <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>tweets<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> onTwitterLoaded<span class="br0">&#40;</span>event:TwitterLoadEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTitle<span class="br0">&#40;</span>event.<span class="me1">proxy</span>.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTweets<span class="br0">&#40;</span>event.<span class="me1">proxy</span>.<span class="me1">getTweets</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In the onTwitterLoaded function, you can see the two most important calls that we need to make on the TwitterProxy: getTitle() and getTweets(). I put these in the ITwitterProxy interface.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw3">interface</span> ITwitterProxy <span class="kw3">extends</span> IEventDispatcher <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> getTweets<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Array</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> getTitle<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So now we have a fairly basic view, which expects its data from the proxy. </p>
<p>Let&#8217;s see it in action, courtesy of TwitterApp. Yep, not much happening:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterApp <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterApp<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; init<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> view:TwitterView = <span class="kw2">new</span> TwitterView<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>view<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; view.<span class="me1">init</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We want to practise test-driven development &#8211; write a failing test > code until it passes > write another test > refactor &#8211; so we want to write a unit test that will check the view&#8217;s title and tweets, but (a) we can&#8217;t rely on the live twitter data as it will change over time, and (b) we don&#8217;t want to run up against the limit of API calls that we can make. Time for a mock object, methinks.</p>
<p>Firstly, I&#8217;m using <a href="http://asunit.org">ASUnit</a> rather than FlexUnit, so if you&#8217;re following along, you&#8217;ll need to grab that and the <a href="http://blog.hoardinghopes.com/index.php/2009/07/mockito-flex-meets-asunit/">ASUnitMockitoTestCase bridging class</a> that I published one or two articles ago. Let&#8217;s start with a skeleton testcase:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterTest <span class="kw3">extends</span> ASUnitMockitoTestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterTest<span class="br0">&#40;</span>testMethod:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#93;</span>, testMethod<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testBasic<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertTrue<span class="br0">&#40;</span><span class="st0">&quot;failing test&quot;</span>, <span class="nu0">1</span> + <span class="nu0">1</span> == <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Notice that we have a basic test that will show up as a fail in ASUnit, so that we can be sure that we&#8217;ve hooked everything together successfully. As soon as you see the fail, you can delete it. Note also that the call to super() starts with an empty Array &#8211; in time we&#8217;ll populate with the classes that we wish to set up as mocks.</p>
<p>Now, let&#8217;s pause for a think about what we want to test here &#8211; the View relies on the proxy for its data, so we want to check that the view gets its data successfully from the proxy <em>without hitting the live Twitter servers</em>. Oh, and the proxy doesn&#8217;t exist yet, just an interface.</p>
<p>I&#8217;m going to start really slowly here, forgive me &#8211; adding the assert that checks the view&#8217;s title.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterTest <span class="kw3">extends</span> ASUnitMockitoTestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterTest<span class="br0">&#40;</span>testMethod:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#93;</span>, testMethod<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testViewGetTitle<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span>, view.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Immediate compile error, since we haven&#8217;t declared view, so let&#8217;s add another line: </p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> view:TwitterView = <span class="kw2">new</span> TwitterView<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">assertEquals<span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span>, view.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Still no success, because the TwitterView cannot be instantiated without a ITwitterProxy, which we don&#8217;t have, so let&#8217;s mock that (note that I&#8217;ve also added ITwitterProxy to the super() in the TwitterTest() constructor).</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterTest <span class="kw3">extends</span> ASUnitMockitoTestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterTest<span class="br0">&#40;</span>testMethod:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#91;</span>ITwitterProxy<span class="br0">&#93;</span>, testMethod<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testViewGetTitle<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> mockProxy:ITwitterProxy = mock<span class="br0">&#40;</span>ITwitterProxy<span class="br0">&#41;</span> as ITwitterProxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> view:TwitterView = <span class="kw2">new</span> TwitterView<span class="br0">&#40;</span>mockProxy<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; view.<span class="me1">init</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span>, view.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Huzzah &#8211; the movie compiles and we get our failing test <img src='http://blog.flexiblediamond.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  For the record, mock() takes the interface and builds an object based on it that will record all calls made on its methods &#8211; it&#8217;s very, very clever.</p>
<p>First thing, let&#8217;s set the mockProxy up to give us the title string that we expect &#8211; add this line above the creation of the view:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>mockProxy.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>This beautiful line of code says: if someone calls getTitle() on the mockProxy, the mockProxy will return &#8220;Twitter updates&#8221;. Isn&#8217;t that cool? Of course, that doesn&#8217;t help pass the test just yet.</p>
<p>The view is expecting to receive a TwitterLoadEvent from the proxy, triggering onTwitterLoaded(), so our mock object needs to have IEventDispatcher functionality. However, because the mockObject does so much weird stuff behind the scenes that I don&#8217;t have (and don&#8217;t want to have) a clue about, I&#8217;m going to attack this another way.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>mockProxy.<span class="me1">addEventListener</span><span class="br0">&#40;</span>any<span class="br0">&#40;</span><span class="br0">&#41;</span>, any<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">will</span><span class="br0">&#40;</span>fireImmediateLoadEvent<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>When mockProxy.addEventListener() is called, it will fire an immediate load event &#8211; this is mocking the request/response communication with the Twitter server. So what&#8217;s fireImmediateLoadEvent?</p>
<p>It&#8217;s a GenericAnswer object, which just holds a function that will be called when addEventListener() is called; in this case I want it to be like this:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> fireImmediateLoadEvent:Answer = <span class="kw2">new</span> GenericAnswer<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// record the event and eventHandler somehow</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// then immediately fire the event with the required data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Of course, in the real world, the proxy will be doing this as part of its work, but because we&#8217;re using a mock proxy, we have to work around it a bit. I&#8217;ve come up with this:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> d:EventDispatcher = <span class="kw2">new</span> EventDispatcher<span class="br0">&#40;</span><span class="br0">&#123;</span><span class="br0">&#125;</span> as IEventDispatcher<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> fireImmediateLoadEvent:Answer = <span class="kw2">new</span> GenericAnswer<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// record the event and eventHandler somehow</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TwitterLoadEvent.<span class="me1">TWITTER_LOADED</span>, view.<span class="me1">onTwitterLoaded</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// then immediately fire the event with the required data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> TwitterLoadEvent<span class="br0">&#40;</span>mockProxy<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>So now the test looks like this:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testViewGetTitle<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// create an EventDispatcher that can be used as the dispatching functionality for</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// the mock ITwitterClient</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> d:EventDispatcher = <span class="kw2">new</span> EventDispatcher<span class="br0">&#40;</span><span class="br0">&#123;</span><span class="br0">&#125;</span> as IEventDispatcher<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> mockProxy:ITwitterProxy = mock<span class="br0">&#40;</span>ITwitterProxy<span class="br0">&#41;</span> as ITwitterProxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; given<span class="br0">&#40;</span>mockProxy.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; given<span class="br0">&#40;</span>mockProxy.<span class="me1">getTweets</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">&quot;Tweet#1&quot;</span>, <span class="st0">&quot;Tweet#2&quot;</span>, <span class="st0">&quot;Tweet#3&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> view:TwitterView = <span class="kw2">new</span> TwitterView<span class="br0">&#40;</span>mockProxy<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> fireImmediateLoadEvent:Answer = <span class="kw2">new</span> GenericAnswer<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// add the listening class</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TwitterLoadEvent.<span class="me1">TWITTER_LOADED</span>, view.<span class="me1">onTwitterLoaded</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// then immediately fire the event &#8211; this mocks the XML-loading that really occurs</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> TwitterLoadEvent<span class="br0">&#40;</span>mockProxy<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; given<span class="br0">&#40;</span>mockProxy.<span class="me1">addEventListener</span><span class="br0">&#40;</span>any<span class="br0">&#40;</span><span class="br0">&#41;</span>, any<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">will</span><span class="br0">&#40;</span>fireImmediateLoadEvent<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; view.<span class="me1">init</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;Twitter updates&quot;</span>, view.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>For completeness, here&#8217;s TwitterLoadEvent:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">class</span> TwitterLoadEvent <span class="kw3">extends</span> Event <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw3">static</span> const TWITTER_LOADED:<span class="kw3">String</span> = <span class="st0">&quot;onTwitterLoaded&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _proxy:ITwitterProxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TwitterLoadEvent<span class="br0">&#40;</span>proxy:ITwitterProxy<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span>TWITTER_LOADED, <span class="kw2">false</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _proxy = proxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">get</span> proxy<span class="br0">&#40;</span><span class="br0">&#41;</span>:ITwitterProxy <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _proxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2009%2F08%2Fwhats-the-point-of-all-this-mockery%2F';
  addthis_title  = 'What%26%238217%3Bs+the+point+of+all+this+mockery%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/about/">About Us</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2009/08/whats-the-point-of-all-this-mockery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mocking slavery</title>
		<link>http://blog.flexiblediamond.com/2009/07/mocking-slavery/</link>
		<comments>http://blog.flexiblediamond.com/2009/07/mocking-slavery/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 17:50:41 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[mocking]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=154</guid>
		<description><![CDATA[New to the idea of such mockery, I was very lucky to find a tutorial using the Java version which I could convert as I worked through it.
Now I&#8217;m converted &#8211; it&#8217;s a very neat and fast way of stubbing out the behaviours that I wish to code.
This morning, however, I came across a slightly [...]]]></description>
			<content:encoded><![CDATA[<p>New to the idea of such mockery, I was very lucky to find <a href="http://schuchert.wikispaces.com/Mockito.LoginServiceExample">a tutorial using the Java version</a> which I could convert as I worked through it.</p>
<p>Now I&#8217;m converted &#8211; it&#8217;s a very neat and fast way of stubbing out the behaviours that I wish to code.</p>
<p>This morning, however, I came across a slightly trickier case to mock &#8211; at least, a case that required trial and error, as it hasn&#8217;t been documented that fully.</p>
<p>I have a slave interface:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw3">interface</span> ISlave <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> doSthg<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> order<span class="br0">&#40;</span>command:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">void</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> answer<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And the behaviour I want is that when a slave is ordered to &#8220;doSthg!&#8221;, it should answer() and doSthg() pretty sharpish. So the test looks like this:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">slave.<span class="me1">order</span><span class="br0">&#40;</span><span class="st0">&quot;doSthg!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">verify<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">that</span><span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">verify<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">that</span><span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>To verify().that(slave.answer()) means to verify that slave.answer was called once.</p>
<p>First off, I needed to define the doSthg() and answer() methods, having created a mock slave from the interface (both return a String object):</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> slave:ISlave = mock<span class="br0">&#40;</span>ISlave<span class="br0">&#41;</span> as ISlave;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;done!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;yessir!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>And then I came to the tricky bit &#8211; since I&#8217;m creating this object out of an Interface definition how can I define the behaviour of slave.order()?</p>
<p>Well, thankfully the GenericAnswer object literally holds the answer to that question &#8211; it is instantiated with a function thus and given to the mock slave.order (if the call parameter is correct!):</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> answer:Answer = <span class="kw2">new</span> GenericAnswer<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">order</span><span class="br0">&#40;</span><span class="kw3">eq</span><span class="br0">&#40;</span><span class="st0">&quot;doSthg!&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">will</span><span class="br0">&#40;</span>answer<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>So now I have created an ISlave interface with three public methods, and defined how the methods interact, and precisely what parameter in order() will trigger the correct interaction. In full it looks like this:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> slave:ISlave = mock<span class="br0">&#40;</span>ISlave<span class="br0">&#41;</span> as ISlave;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;done!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">willReturn</span><span class="br0">&#40;</span><span class="st0">&quot;yessir!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> answer:Answer = <span class="kw2">new</span> GenericAnswer<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">given<span class="br0">&#40;</span>slave.<span class="me1">order</span><span class="br0">&#40;</span><span class="kw3">eq</span><span class="br0">&#40;</span><span class="st0">&quot;doSthg!&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">will</span><span class="br0">&#40;</span>answer<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">slave.<span class="me1">order</span><span class="br0">&#40;</span><span class="st0">&quot;doSthg!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">verify<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">that</span><span class="br0">&#40;</span>slave.<span class="me1">answer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">verify<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">that</span><span class="br0">&#40;</span>slave.<span class="me1">doSthg</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>P.S. Obviously, the slave should not have a order() method &#8211; that&#8217;s the responsibility of the master (e.g. master.order(slave, &#8220;doSthg!&#8221;)), but it serves to make this example work, so forgive me!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2009%2F07%2Fmocking-slavery%2F';
  addthis_title  = 'Mocking+slavery';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/2009/08/whats-the-point-of-all-this-mockery/">What&#8217;s the point of all this mockery?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2009/07/mocking-slavery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mockito-Flex meets ASUnit</title>
		<link>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/</link>
		<comments>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 17:50:20 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=163</guid>
		<description><![CDATA[Well, that&#8217;s not a catchy headline, but it does pretty much sum it up. I&#8217;ve been playing with Mockito-Flex, a mock object framework for Actionscript 3. It&#8217;s great, and made vastly easier to pick up by a Mockito-FlexUnit bridge in the form of a MockitoTestCase that does the hard work of reporting the mocking results [...]]]></description>
			<content:encoded><![CDATA[<p>Well, that&#8217;s not a catchy headline, but it does pretty much sum it up. I&#8217;ve been playing with <a href="http://bitbucket.org/loomis/mockito-flex/wiki/Home">Mockito-Flex</a>, a <a href="http://en.wikipedia.org/wiki/Mock_object">mock object</a> framework for Actionscript 3. It&#8217;s great, and made vastly easier to pick up by a Mockito-FlexUnit bridge in the form of a MockitoTestCase that does the hard work of reporting the mocking results and validations in a way that FlexUnit can display.</p>
<p>Of course, <a href="http://opensource.adobe.com/wiki/display/flexunit/FlexUnit;">FlexUnit</a> does require the Flex framework, which bulks up the whole thing. Oh, and I&#8217;m used to using <a href="http://asunit.org">ASUnit</a>. So I&#8217;ve written the following class that does the same job as MockitoTestCase, but for ASUnit:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The MIT License</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Copyright (c) 2009 Mockito contributors</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Permission is hereby granted, free of charge, to any person obtaining a copy of this software</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* subject to the following conditions:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">package org.<span class="me1">mockito</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> asunit.<span class="me1">framework</span>.<span class="me1">TestCase</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Matcher</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">MethodSelector</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">MockCreator</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Stubber</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">mockito</span>.<span class="me1">api</span>.<span class="me1">Verifier</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> ASUnitMockitoTestCase <span class="kw3">extends</span> TestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _mockClasses:<span class="kw3">Array</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">var</span> mockito:Mockito;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> ASUnitMockitoTestCase<span class="br0">&#40;</span>mockClasses:<span class="kw3">Array</span>, testMethod:<span class="kw3">String</span> = <span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _mockClasses = mockClasses;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span>testMethod<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Due to the asynchronous nature of the class generation</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* a test needs to execute from a callback function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> override <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mockito == <span class="kw2">null</span> <span class="sy0">&amp;&amp;</span> _mockClasses<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mockito = <span class="kw2">new</span> Mockito<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> superRun:<span class="kw2">Function</span> = <span class="kw3">super</span>.<span class="me1">run</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mockito.<span class="me1">prepareClasses</span><span class="br0">&#40;</span>_mockClasses, repositoryPreparedHandler<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> repositoryPreparedHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; superRun<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">super</span>.<span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Constructs mock object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param clazz a class of the mock object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param constructorArgs constructor arguments required to create mock instance</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param name a name used in various output</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return a mocked object</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> mock<span class="br0">&#40;</span>classToMock:<span class="kw2">Class</span>, <span class="kw3">name</span>:<span class="kw3">String</span> = <span class="kw2">null</span>, constructorArgs:<span class="kw3">Array</span> = <span class="kw2">null</span><span class="br0">&#41;</span>:<span class="kw3">Object</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">mock</span><span class="br0">&#40;</span>classToMock, <span class="kw3">name</span>, constructorArgs<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A starter function for verification of executions</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* If you dont specify the verifier, an equivalent of times(1) is used.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param verifier object responsible for verification of the following execution</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> verify<span class="br0">&#40;</span>verifier:Verifier = <span class="kw2">null</span><span class="br0">&#41;</span>:MethodSelector</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">verify</span><span class="br0">&#40;</span>verifier<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A starter function for stubbing</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param methodCallToStub call a method to stub as an argument</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return an object providing stubbing options</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> given<span class="br0">&#40;</span>methodCallToStub:<span class="sy0">*</span><span class="br0">&#41;</span>:Stubber</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">given</span><span class="br0">&#40;</span>methodCallToStub<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @private</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; protected <span class="kw2">function</span> <span class="kw3">get</span> mockCreator<span class="br0">&#40;</span><span class="br0">&#41;</span>:MockCreator</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Matches any argument including &lt;code&gt;null&lt;/code&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> any<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">any</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Equality matcher</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(never()).that(system.login(eq(&quot;root&quot;)));</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">eq</span><span class="br0">&#40;</span>expected:<span class="sy0">*</span><span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="kw3">eq</span><span class="br0">&#40;</span>expected<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for making sure call hasn&#39;t happened</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(never()).that(operator.execute());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> never<span class="br0">&#40;</span><span class="br0">&#41;</span>:Verifier</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">never</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for counting calls</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify(times(2)).that(operator.execute());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> times<span class="br0">&#40;</span>expectedCallsCount:<span class="kw3">int</span><span class="br0">&#41;</span>:Verifier</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">times</span><span class="br0">&#40;</span>expectedCallsCount<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A fluent interface for custom matcher</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Example:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* verify().that(system.login(argThat(new HashOnlyCapitalLettersMatcher())));</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* A good practice is to create a matcher recording function somewhere and name it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* after the matcher. It&#39;s important to return a wildcard from the function to let it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* work with any arugment of the function</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* function hasOnlyCapitalLetters():*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* {</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; argThat(new HashOnlyCapitalLettersMatcher());</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* }</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &lt;/listing&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> argThat<span class="br0">&#40;</span>matcher:Matcher<span class="br0">&#41;</span>:<span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mockito.<span class="me1">argThat</span><span class="br0">&#40;</span>matcher<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I&#8217;ve built this against ASUnit3, and it appears to be running fine. As you can see, it&#8217;s release under the MIT license, as is Mockito-Flex. I&#8217;d appreciate any feedback that&#8217;s going, so have a play and let me know &#8230;</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2009%2F07%2Fmockito-flex-meets-asunit%2F';
  addthis_title  = 'Mockito-Flex+meets+ASUnit';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/2008/06/testing-proxies-in-puremvc/">Testing Proxies in PureMVC</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2009/07/mockito-flex-meets-asunit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testing Proxies in PureMVC</title>
		<link>http://blog.flexiblediamond.com/2008/06/testing-proxies-in-puremvc/</link>
		<comments>http://blog.flexiblediamond.com/2008/06/testing-proxies-in-puremvc/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 13:13:25 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[puremvc]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=55</guid>
		<description><![CDATA[This post is prompted by Larry Marburger&#8217;s article, since I came across this problem a few weeks ago, and found a different solution.
The scenario
There&#8217;s this great new framework that you&#8217;re starting to use, and it&#8217;s persuaded you to turn a new leaf and unit-test your work as you go. First off, be warned this is [...]]]></description>
			<content:encoded><![CDATA[<p>This post is prompted by <a href="http://developmentastic.com/2008/06/09/flexunit-testing-puremvc-code/">Larry Marburger&#8217;s article</a>, since I came across this problem a few weeks ago, and found a different solution.</p>
<p><strong>The scenario</strong><br />
There&#8217;s <a href="http://www.puremvc.org">this great new framework</a> that you&#8217;re starting to use, and it&#8217;s persuaded you to turn a new leaf and unit-test your work as you go. First off, be warned this is all AS2.0, using <a href="http://www.asunit.org">asunit2.5</a>, because I&#8217;m still stuck in the dark ages <img src='http://blog.flexiblediamond.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>The problem</strong><br />
PureMVC uses Proxy objects to access data from the model, which fire off Notifications (PureMVC-specific events) when the data is ready. However, in the case of a Proxy that loads XML before making its data available, how do we know when it&#8217;s ready to be tested?</p>
<p><span id="more-55"></span><br />
<strong>Solution </strong><br />
Mediator objects sign up to receive notification of Proxy events in PureMVC, so we can subclass the Mediator to create a class that can run tests on the Proxy.</p>
<p><strong>Example please</strong><br />
ASUnit calls <code>run()</code> for every TestCase in the TestSuite, the default implementation of which calls <code>runNow()</code> to run the tests within a class. So I&#8217;ve overridden <code>run()</code> to create the Proxy we want to test. When the Proxy is ready, it will notify the TestCase, and <code>runNow()</code> will be called.</p>
<p>In order to achieve this, I&#8217;ve created a TestHelper, which subclasses Mediator, to capture the Proxy&#8217;s completion Notification. The TestHelper tells the TestCase that it&#8217;s good to go, and <code>runNow()</code> gets called.</p>
<p><strong>A thousand words</strong></p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/06/sequence.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/06/sequence-300x214.png" alt="" title="Sequence for testing Proxies in PureMVC" width="300" height="214" class="alignnone size-medium wp-image-56" /></a></p>
<p><strong>Implementation Specifics</strong></p>
<p>First, the class we&#8217;re interested in, and as you can see, it&#8217;s very simple. It registers with the PureMVC ApplicationFacade for <code>Events.XML_LOADED</code> Notifications, and calls the responseHandler it was given by when created by NavigationProxyTest (<code>runNow()</code>).</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">import</span> org.<span class="me1">puremvc</span>.<span class="me1">as2</span>.<span class="me1">interfaces</span>.<span class="me1">IMediator</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">import</span> org.<span class="me1">puremvc</span>.<span class="me1">as2</span>.<span class="me1">interfaces</span>.<span class="me1">INotification</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">import</span> org.<span class="me1">puremvc</span>.<span class="me1">as2</span>.<span class="me1">patterns</span>.<span class="me1">mediator</span>.<span class="me1">Mediator</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">import</span> Events;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> NavigationProxyTestHelper <span class="kw3">extends</span> Mediator <span class="kw3">implements</span> IMediator <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">var</span> <span class="kw3">NAME</span>:<span class="kw3">String</span> = <span class="st0">&quot;NavigationProxyTestHelper&quot;</span>; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">private</span> <span class="kw2">var</span> _responseHandler:<span class="kw2">Function</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> NavigationProxyTestHelper<span class="br0">&#40;</span>view:<span class="kw3">Object</span>, <span class="kw3">name</span>:<span class="kw3">String</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="kw3">name</span> <span class="sy0">||</span> <span class="kw3">NAME</span>, view<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> listNotificationInterests<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Array</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="br0">&#91;</span>Events.<span class="me1">XML_LOADED</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> handleNotification<span class="br0">&#40;</span>notification:INotification<span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>notification.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">case</span> Events.<span class="me1">XML_LOADED</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; _responseHandler<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> setResponseHandler<span class="br0">&#40;</span>response:<span class="kw2">Function</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; _responseHandler = response;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The NavigationProxyTest TestCase sets up the TestHelper in <code>run()</code>, and registers it with the ApplicationFacade. Then it creates the NavigationProxy instance that we want to test. When the Proxy is fully-loaded and raring to go, <code>TestCase#runNow()</code> will be called, which calls all methods starting &#8220;test&#8221; &#8211; so in this example <code>testValuesFromXML()</code>.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> NavigationProxyTest <span class="kw3">extends</span> TestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">private</span> instance:NavigationProxy;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> mediator:NavigationProxyTestHelper = <span class="kw2">new</span> NavigationProxyTestHelper<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">createEmptyMovieClip</span><span class="br0">&#40;</span><span class="st0">&quot;empty_mc&quot;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; NavigationProxyTestHelper.<span class="kw3">NAME</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ApplicationFacade.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">registerMediator</span><span class="br0">&#40;</span>mediator<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; NavigationProxyTestHelper<span class="br0">&#40;</span>mediator<span class="br0">&#41;</span>.<span class="me1">setResponseHandler</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Delegate.<span class="me1">create</span><span class="br0">&#40;</span><span class="kw3">this</span>, runNow<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; instance = <span class="kw2">new</span> NavigationProxy<span class="br0">&#40;</span><span class="st0">&quot;navigation.xml&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">public</span> <span class="kw2">function</span> testValuesFromXML<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// initialDestination &amp; showIntroVideo are found in the XML that the NavigationProxy loads</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;destinationID = 72&quot;</span>, <span class="nu0">72</span>, instance.<span class="me1">initialDestination</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertFalse<span class="br0">&#40;</span><span class="st0">&quot;showIntroVideo = true&quot;</span>, instance.<span class="me1">showIntroVideo</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F06%2Ftesting-proxies-in-puremvc%2F';
  addthis_title  = 'Testing+Proxies+in+PureMVC';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div id="wherego_related"><h3>Readers who viewed this page also viewed:</h3><ul><li><a href="http://blog.flexiblediamond.com/2009/07/mocking-slavery/">Mocking slavery</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/06/testing-proxies-in-puremvc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Project in distress (III)</title>
		<link>http://blog.flexiblediamond.com/2008/05/project-in-distress-iii/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/project-in-distress-iii/#comments</comments>
		<pubDate>Mon, 12 May 2008 21:46:29 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[distress]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=45</guid>
		<description><![CDATA[It&#8217;s Monday, so I&#8217;m back with fresh energy. Soon sapped by the realisation that if we ballpark 2 months for development (excluding testing/bugfixing), we need to start at the beginning of June. Which means the designs have to be finalised and signed-off within 3 weeks, and we haven&#8217;t even agreed all the content for the [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s Monday, so I&#8217;m back with fresh energy. Soon sapped by the realisation that if we ballpark 2 months for development (excluding testing/bugfixing), we need to start at the beginning of June. Which means the designs have to be finalised and signed-off within 3 weeks, and we haven&#8217;t even agreed all the content for the site yet.</p>
<p>Here&#8217;s a twist I haven&#8217;t come across before &#8211; the site is companion to a quarterly members&#8217; magazine, so the design has to cover both versions. As a result, the print designers of the magazine get to take the lead on the look&#8217;n'feel and design, and once they&#8217;re happy hand it off to the digital designer. All within 3 weeks obviously.</p>
<p>None of the designers have worked with me before, so this&#8217;ll be double fun.</p>
<p>Oh, and there&#8217;s a &#8220;secret&#8221; area of the site for magazine subscribers. So secret, apparently, that we aren&#8217;t yet privy to what will go in it.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fproject-in-distress-iii%2F';
  addthis_title  = 'Project+in+distress+%28III%29';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/project-in-distress-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An evaporating conflict cloud</title>
		<link>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/#comments</comments>
		<pubDate>Mon, 12 May 2008 21:40:06 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=30</guid>
		<description><![CDATA[Doing our best doesn&#8217;t guarantee success, despite best intentions. How do we identify the behaviours that we want and don&#8217;t want, and find the inherent conflicts within the system?
Let&#8217;s take one of the problems in the previous article (It&#8217;s not rocket science), and see what&#8217;s driving it, which may give us a better perspective towards [...]]]></description>
			<content:encoded><![CDATA[<p>Doing our best doesn&#8217;t guarantee success, despite best intentions. How do we identify the behaviours that we want and don&#8217;t want, and find the inherent conflicts within the system?</p>
<p>Let&#8217;s take one of the problems in the <a href="http://blog.hoardinghopes.com/index.php/2008/05/its-not-rocket-science/">previous article (<em>It&#8217;s not rocket science</em>)</a>, and see what&#8217;s driving it, which may give us a better perspective towards possible fixes.</p>
<p><span id="more-30"></span></p>
<p>I&#8217;m going to use a tool that I first saw (read, actually) used by <a href="http://clarkeching.blogs.com/">Clarke Ching</a> in <em><a href="http://www.rollingrocksdownhill.com/">Rolling Rocks Downhill</a></em>, which uses a diagram to define the conflicting behaviour, and thence to uncover the assumptions behind it.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/structure.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/structure.png" title="Conflict cloud diagram structure" width="500" height="269" class="alignnone size-full wp-image-39" /></a></p>
<p></p>
<p><strong>1. state the behaviour that you want to get rid of</strong><br />
I said that developers were so pushed for time that they didn&#8217;t test their code as they wrote it, nor before committing it to Subversion, our code control system. They were clear that they were working as hard as they could &#8211; doing the best they could &#8211; in the circumstances. Their repeated complaint was that the requirements kept changing so nothing could be finalised. That statement goes into the box marked D.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/undesirable_d.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/undesirable_d.png" alt="The behaviour that we want to get rid of " title="Undesirable behaviour" class="alignnone size-full wp-image-39" /></a></p>
<p><strong>2. State the need that is being met by the undesirable behaviour, or which drives us putting up with it</strong><br />
On this project, at least, it was crystal clear &#8211; we had no time: we just had to meet the deadlines. Speed was driving slapdash development methods. So that&#8217;s what goes into the box marked B.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_b.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_b.png" alt="" title="Need B, which is achieved by the undesirable behaviour" class="alignnone size-full wp-image-40" /></a></p>
<p></p>
<p><strong>3. State the behaviour you desire, which is the opposite of D</strong><br />
Again, straightforward:  I want developers to test their code before they commit/release it. This goes in the box labelled D&#8217; (&#8221;d prime&#8221;).</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/desirable_d.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/desirable_d.png" alt="" title="The behaviour we desire" class="alignnone size-full wp-image-41" /></a></p>
<p></p>
<p><strong>4. The need that the desirable behaviour fulfills</strong><br />
Well, if we&#8217;re testing, we&#8217;re catching bugs during the development phase when it is cheaper/easier to fix them, rather than the later testing phase. That goes in box C.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_c.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/need_c.png" alt="" title="The need met by the desired-for behaviour" class="alignnone size-full wp-image-42" /></a></p>
<p></p>
<p><strong>5. The objective that the needs fulfill by both being present</strong><br />
Need B is meeting the schedule/delivering the project on time; Need C is delivering a high-quality product. Thus the objective we have to put in box A is: delivering a high-quality project on time and budget.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/objective_a.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/objective_a.png" alt="" title="The objective that we\&#039;re trying to achieve" class="alignnone size-full wp-image-43" /></a></p>
<p></p>
<p>So, put it all together, and you get the conflicting behaviours and the reasons behind them, and a reminder that both reasons are aiming at the same target. Note also that for the objective to be reached, both needs have to be met, i.e. desirable and undesirable behaviour both have the same ultimate goal.</p>
<p><a href='http://blog.hoardinghopes.com/wp-content/uploads/2008/05/completed_conflict.png'><img src="http://blog.hoardinghopes.com/wp-content/uploads/2008/05/completed_conflict.png" alt="" title="The completed conflict" class="alignnone size-full wp-image-44" /></a></p>
<p>I&#8217;ll look at what comes assumptions are revealed from this exercise shortly.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fan-evaporating-conflict-cloud%2F';
  addthis_title  = 'An+evaporating+conflict+cloud';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/an-evaporating-conflict-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diary of a project in distress (II)</title>
		<link>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress-ii/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress-ii/#comments</comments>
		<pubDate>Thu, 08 May 2008 16:11:06 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[distress]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=36</guid>
		<description><![CDATA[I&#8217;ve spent today going through all the documents with a fine toothcomb, to extract a list of business, technical, and design requirements. I&#8217;ve come away with a long list of questions (most of which can&#8217;t be answered yet, I suspect).
Tomorrow is the day for digging out the answers.

  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fdiary-of-a-project-in-distress-ii%2F';
 [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spent today going through all the documents with a fine toothcomb, to extract a list of business, technical, and design requirements. I&#8217;ve come away with a long list of questions (most of which can&#8217;t be answered yet, I suspect).</p>
<p>Tomorrow is the day for digging out the answers.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fdiary-of-a-project-in-distress-ii%2F';
  addthis_title  = 'Diary+of+a+project+in+distress+%28II%29';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diary of a project in distress</title>
		<link>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress/</link>
		<comments>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress/#comments</comments>
		<pubDate>Wed, 07 May 2008 15:29:12 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[distress]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=34</guid>
		<description><![CDATA[The plan is to note all the little steps and stumbles that a new project takes on its way to failure.
Day 1: I&#8217;ve just had a meeting to talk through the pitch designs, proposed functionality, and sitemap for a new project, which has to be delivered by the end of July. The sitemap is out [...]]]></description>
			<content:encoded><![CDATA[<p>The plan is to note all the little steps and stumbles that a new project takes on its way to failure.</p>
<p><strong>Day 1</strong>: I&#8217;ve just had a meeting to talk through the pitch designs, proposed functionality, and sitemap for a new project, which has to be delivered by the end of July. The sitemap is out of date, including sections that apparently won&#8217;t exist in the finished project; functionality is uncertain, and designs are incomplete. We have another meeting later this afternoon to meet the Group Account Director, to bombard him with questions.</p>
<p><strong>Day 1(a)</strong>: We heard that the project, which had been costed at Â£94K, had actually been sold at Â£54K, and that we offered hosting at a monthly cost of Â£250, which by our estimates will require load balanced SQL Servers (which we recently costed at Â£2 &#8211; 3K pm).</p>
<p>No, there&#8217;s nothing that can be descoped or delivered later; it&#8217;s all Flash; and the designs haven&#8217;t been completed yet alone signed off.</p>
<p>Oh, but the deadline has apparently moved to the end of August <img src='http://blog.flexiblediamond.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F05%2Fdiary-of-a-project-in-distress%2F';
  addthis_title  = 'Diary+of+a+project+in+distress';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/05/diary-of-a-project-in-distress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software development processes</title>
		<link>http://blog.flexiblediamond.com/2008/04/software-development-processes/</link>
		<comments>http://blog.flexiblediamond.com/2008/04/software-development-processes/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 14:35:47 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=31</guid>
		<description><![CDATA[One of the most concise and accurate summaries of available processes that I&#8217;ve come across. If only more devs and Project Managers printed this out, we would have a much more successful industry record.

  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Fsoftware-development-processes%2F';
  addthis_title  = 'Software+development+processes';
  addthis_pub    = '';

]]></description>
			<content:encoded><![CDATA[<p><a href="http://weblogs.java.net/blog/chet/archive/2008/01/crystal_methodo.html">One of the most concise and accurate summaries of available processes that I&#8217;ve come across</a>. If only more devs and Project Managers printed this out, we would have a much more successful industry record.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Fsoftware-development-processes%2F';
  addthis_title  = 'Software+development+processes';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/04/software-development-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test-driving a HashMap</title>
		<link>http://blog.flexiblediamond.com/2008/04/test-driving-a-hashmap/</link>
		<comments>http://blog.flexiblediamond.com/2008/04/test-driving-a-hashmap/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 18:41:59 +0000</pubDate>
		<dc:creator>jamesk</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://blog.hoardinghopes.com/?p=19</guid>
		<description><![CDATA[Right, here&#8217;s a TDD* walk-through, creating a new class tests-first.

HashMap
I&#8217;ve deliberately picked a fairly uninteresting class, as I want to focus on the process. It&#8217;s a utility data-holding object found in Java, more formalised than the ubiquitous Object that&#8217;s found in Flash applications the world over. That I&#8217;m stealing from Java is good, as we [...]]]></description>
			<content:encoded><![CDATA[<p>Right, here&#8217;s a TDD* walk-through, creating a new class tests-first.</p>
<p><span id="more-19"></span></p>
<p><strong>HashMap</strong><br />
I&#8217;ve deliberately picked a fairly uninteresting class, as I want to focus on the process. It&#8217;s a utility data-holding object found in Java, more formalised than the ubiquitous Object that&#8217;s found in Flash applications the world over. That I&#8217;m stealing from Java is good, as we don&#8217;t need to design it &#8211; we just need to implement the same API:</p>
<blockquote><p>
- size():Number<br />
- put(key:Object, value:Object):Object //returns previous value associated with key, or null<br />
- get(key:Object):Object //returns value mapped to key<br />
- clear():Void //empties the HashMap<br />
- containsKey(key:Object):Boolean<br />
- containsValue(value:Object):Boolean<br />
- isEmpty():Boolean<br />
- keySet():Array //returns an Array of keys<br />
- putAll(hashmap:HashMap):Void //puts the contents of another HashMap into this one<br />
- remove(key:Object):Object {//returns previous value associated with key, or null<br />
- values():Array //returns an Array of values
</p></blockquote>
<p>Handily that API gives us our to-do list for the exercise (though we won&#8217;t get through it all).</p>
<p><strong>Setting up the project</strong><br />
Firstly, if you don&#8217;t have asunit already, have a read-through this post which sets it up.</p>
<p>Set up a directory for this exercise. Create a new Actionscript 2.0 fla** in there called hashmap_tester.fla.</p>
<p>Add two lines to the first frame:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">import</span> AllTests;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> at:AllTests = <span class="kw2">new</span> AllTests<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Now test the movie.</p>
<p>It complains that it can&#8217;t find <code>AllTests</code>, so let&#8217;s create that:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> AllTests <span class="kw3">extends</span> com.<span class="me1">asunit</span>.<span class="me1">framework</span>.<span class="me1">TestSuite</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw2">var</span> className:<span class="kw3">String</span> = <span class="st0">&quot;AllTests&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> AllTests<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//addTest(new HashMapTest());</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>and now testing throws no errors, and we&#8217;re good to think about the HashMap.</p>
<p><strong>Where to start?</strong><br />
Why are we even going down this route? Well, I don&#8217;t know about you, but I have a habit of thinking about a class for 5 minutes and then jumping straight into coding it. On a large/formal project, I plan enough to come up with a convincing overview of the likely class structure, but don&#8217;t drill down to a detailed level. Look, a class diagram, let&#8217;s get coding!</p>
<p>So, other folks&#8217; motivations may be different, but I follow a test-driven process because </p>
<ul>
<li>I need something to prevent me coding before I&#8217;ve thought about design, and</li>
<li>I&#8217;m sick of leaving all thought of testing to the end of a project when we&#8217;re already squeezed for time</li>
</ul>
<p>Therefore, we&#8217;re going to start with a single method from the Java API: <code>size()</code>, and define how we want it to behave (actually, <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html#size()">the Java boys have already done that</a>):</p>
<blockquote><p>size():int &#8211; Returns the number of key-value mappings in this map.</p></blockquote>
<p>Whilst that&#8217;s already clear, it&#8217;s not specific enough to write a test (humour me). So, let&#8217;s agree that calling size() on an empty HashMap will return 0, calling size() on a HashMap with a single entry will return 1, one with 2 entries will return 2, and so on. I know I&#8217;m stating the bleeding obvious, but these are the statements that will prove our job is done.</p>
<p><strong>Setting up the testing class</strong><br />
TDD uses unit tests, which verify single units of functionality, so we end up with a single class (HashMap) being tested by a single test class (HashMapTest).</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> HashMapTest <span class="kw3">extends</span> com.<span class="me1">asunit</span>.<span class="me1">framework</span>.<span class="me1">TestCase</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw2">var</span> className:<span class="kw3">String</span> = <span class="st0">&quot;HashMapTest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testIt<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; assertTrue<span class="br0">&#40;</span><span class="st0">&quot;failing test&quot;</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now uncomment the line <code>addTest(new HashMapTest());</code> in AllTests.as, and test the movie. We get a red bar and the following message:</p>
<pre>
0 out of 1 asserts passed

----------------
Item Failed at :
assertion : assertTrue
message : failingtest
methodName : testIt
className : HashMapTest
</pre>
<p>That&#8217;s the information we need &#8211; which class the problem was in, which method, which assertion, etc. Well, alright, we could have worked all that out, but once there are lots of classes, these pointers will be invaluable.</p>
<p>The rules of TDD are really simple: <strong>Red, Green, Refactor</strong>.<br />
We&#8217;ve got red, which when considering we started with nothing is already a major achievement, so we need to take the next step. Change <code>false</code> to <code>true</code> in the <code>assertTrue</code> statement, and run the movie again. Whatcha got?</p>
<p>Green is cool, calming, and the place to be. In TDD, we start with red, get to green <em>as quickly as possible</em>, and stay there.</p>
<p>Since there isn&#8217;t much refactoring to be done with this test, let&#8217;s move on to writing a test for <code>size()</code>, starting with an empty HashMap.</p>
<p><strong>Testing size()</strong></p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">function</span> testSize<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> instance:HashMap = <span class="kw2">new</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;empty HashMap.size() == 0&quot;</span>, <span class="nu0">0</span>, instance.<span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Run it, and you get a compile error, which handily points out our next move: let&#8217;s create the HashMap class and give it a <code>size()</code> method returning a <code>Number</code>.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> HashMap <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Testing shows we&#8217;re at red, which is progress.<br />
Now all we need to do is get to green, in the simplest and quickest (and dirtiest) way possible. So, I&#8217;m changing <code>return null</code> to <code>return 0</code>.</p>
<p>Obviously, I&#8217;m tricking the test, because we should be testing that there are no entries in there, but that comes with refactoring. For now we&#8217;re just aiming to pass the test, and we do the simplest thing to achieve that.</p>
<p>What&#8217;s next: calling <code>size</code> on a HashMap with a single entry returns <code>1</code>.<br />
But, before we write that test, we need to think about how to put an entry into the HashMap</p>
<p><strong>Putting something into the HashMap</strong></p>
<blockquote><p>
put(key:Object, value:Object):Object //returns previous value associated with key, or null
</p></blockquote>
<p>So, again starting with the tests: the behaviour we&#8217;re specifying is:</p>
<ul>
<li>putting an element (with key &#8220;element1&#8243; and value &#8220;value1&#8243;) into an empty HashMap returns null</li>
<li>putting an element (with key &#8220;element1&#8243; and value &#8220;value2&#8243;) into the HashMap returns the first element (key:&#8221;element1&#8243;, value:&#8221;value1&#8243;)</li>
<li>putting an element (with key &#8220;element2&#8243; and value &#8220;value2&#8243;) into the HashMap returns null</li>
</ul>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">function</span> testPut<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> instance:HashMap = <span class="kw2">new</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> elementKey:<span class="kw3">String</span> = <span class="st0">&quot;element1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> elementValue:<span class="kw3">String</span> = <span class="st0">&quot;value1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNull<span class="br0">&#40;</span><span class="st0">&quot;putting element into empty HashMap returns null&quot;</span>, instance.<span class="me1">put</span><span class="br0">&#40;</span>elementKey, elementValue<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Since we know the compiler&#8217;s going to baulk, let&#8217;s avoid that by adding the following to HashMap.as:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">function</span> put<span class="br0">&#40;</span><span class="kw3">key</span>:<span class="kw3">String</span>, value:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Object</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw3">key</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Note that I&#8217;m returning <code>key</code> to force the test to fail. And fail it does, so change it to <code>return null;</code> and we&#8217;re green. Time to add another assertion. Just duplicate the first, so the same key is being added to the HashMap again, but change the assert itself to <code>assertNotNull</code>.</p>
<p>Dang, fix one thing, break another. Well, this is where the refactoring part of the triad comes in: we need to refactor the code so that it passes both tests. (&#8221;Refactor&#8221; is much better than &#8220;write&#8221;, don&#8217;t you agree? It means that the code is already written, but just needs changing. And that&#8217;s the point &#8211; it is already written in my head).</p>
<p>So what to do? Well the HashMap is essentially a wrapper around a Plain Old Actionscript Object, isn&#8217;t it? If we&#8217;re going to return the first element when we add the second, we need to keep those elements somewhere, so let&#8217;s create a private object to hold them in the HashMap.</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> HashMap <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw2">var</span> map:<span class="kw3">Object</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; map = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> put<span class="br0">&#40;</span><span class="kw3">key</span>:<span class="kw3">String</span>, value:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Object</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Right, if a key doesn&#8217;t already exist in the HashMap, return null, but if it does return its previous value. How should that look?</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">function</span> put<span class="br0">&#40;</span><span class="kw3">key</span>:<span class="kw3">String</span>, value:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Object</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> returnObj:<span class="kw3">Object</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>map<span class="br0">&#91;</span><span class="kw3">key</span><span class="br0">&#93;</span> <span class="sy0">!</span>= <span class="kw3">undefined</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; returnObj = map<span class="br0">&#91;</span><span class="kw3">key</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; map<span class="br0">&#91;</span><span class="kw3">key</span><span class="br0">&#93;</span> = value;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> returnObj;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Well, give it a go, since I&#8217;m coding without thinking too much, and let the tests decide. And they say &#8216;PASS&#8217; &#8211; all is green. Fantastic. Let&#8217;s add the final part of our tests for <code>put</code> to HashMapTest:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">public</span> <span class="kw2">function</span> testPut<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> instance:HashMap = <span class="kw2">new</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> elementKey:<span class="kw3">String</span> = <span class="st0">&quot;element1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> elementValue:<span class="kw3">String</span> = <span class="st0">&quot;value1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNull<span class="br0">&#40;</span><span class="st0">&quot;putting element into empty HashMap returns null&quot;</span>, instance.<span class="me1">put</span><span class="br0">&#40;</span>elementKey, elementValue<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNotNull<span class="br0">&#40;</span><span class="st0">&quot;putting element into empty HashMap returns null&quot;</span>, instance.<span class="me1">put</span><span class="br0">&#40;</span>elementKey, elementValue<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; assertNull<span class="br0">&#40;</span><span class="st0">&quot;putting element into empty HashMap returns null&quot;</span>, instance.<span class="me1">put</span><span class="br0">&#40;</span><span class="st0">&quot;element2&quot;</span>, <span class="st0">&quot;value2&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And it still works! That&#8217;s cool.</p>
<p><strong>Size() re-visited</strong><br />
So now we are able to put elements into the HashMap and have them stay there, we can end the trickery that&#8217;s getting us past the <code>size</code> tests. </p>
<p>Add another assert to <code>testSize</code> in HashMapTest.as:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> testSize<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> instance:HashMap = <span class="kw2">new</span> HashMap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;empty HashMap.size() == 0&quot;</span>, <span class="nu0">0</span>, instance.<span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; instance.<span class="me1">put</span><span class="br0">&#40;</span><span class="st0">&quot;key&quot;</span>, <span class="st0">&quot;value&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; assertEquals<span class="br0">&#40;</span><span class="st0">&quot;HashMap with 1 element, size() == 1&quot;</span>, <span class="nu0">1</span>, instance.<span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s the test. I&#8217;m happy. It compiles and the asunit test runner shows red. I&#8217;m happier. </p>
<p>What is <code>size()</code> supposed to give us? Information about how many elements are in the HashMap, i.e. how many elements are in the private variable <code>map</code>. So we can just iterate through that, and keep a count of how many properties it has:</p>
<div class="geshi no actionscript">
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Number</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> count:<span class="kw3">Number</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> p <span class="kw1">in</span> map<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; count++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> count;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And I reckon that should pass.</p>
<p><strong>To-do list</strong><br />
I&#8217;ve missed a good test out here &#8211; now we know <code>size()</code> is working, then we can use it to verify <code>put</code>&#8217;s behaviour. Specifically, if we add elements using different keys, <code>size</code> will increase each time; but if we add elements using the same key, then they will replace each other and the <code>size</code> will remain the same.</p>
<p>It&#8217;s handy to have a list &#8211; paper- or computer-based &#8211; nearby to record such thoughts when they appear, since you&#8217;re likely to be in the middle of writing a test or refactoring code to pass a test. It also allows you to prioritise, and to go home knowing you can return in the morning and know where to pick up.</p>
<p>Which reminds me. Always finish the day with a failing test. The next morning you turn up, run the tests, and know exactly what you were going to do next. That&#8217;s easy, isn&#8217;t it? (N.B. If you&#8217;re working in a team with source code control &#8211; you are, aren&#8217;t you? &#8211; do not check in this failing test, that might upset the others).</p>
<p><strong>Homework</strong><br />
Well, when did someone last give you homework to do?<br />
You write out the tests to cover the rest of the Java HashMap API. And, if you really fancy it, code the implementation too.</p>
<p><strong>The TDD rhythym</strong><br />
1. Quickly add a test.<br />
2. Run all tests and see the new one fail.<br />
3. Make a little change.<br />
4. Run all tests and see them all succeed.<br />
5. Refactor to remove duplication.</p>
<p>Red, green, refactor.<br />
Red, green, refactor.<br />
Red, green, refactor.</p>
<p>* Test-Driven Development<br />
** I&#8217;m currently working on a project porting AS1.0 to AS2.0, nary a sign of AS3.0. I believe that there are other AS2-ers out there who need information about unit-testing and test-driven development, so I&#8217;m fairly unapologetic about using AS2.0. If you are only coding AS3.0 (lucky you!) and can&#8217;t find resources, shout and I&#8217;ll have a stab at re-writing this for AS3.0, using flexunit.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.flexiblediamond.com%2F2008%2F04%2Ftest-driving-a-hashmap%2F';
  addthis_title  = 'Test-driving+a+HashMap';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexiblediamond.com/2008/04/test-driving-a-hashmap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
